
package com.limegroup.gnutella.xml;

import java.util.List;

import junit.framework.Test;

import com.limegroup.gnutella.util.LimeTestCase;

/**
 * Tests the LimeXMLDocumentHelper logic.
 */
public class DocumentHelperTest extends LimeTestCase {

    public DocumentHelperTest(String name){
        super(name);
    }
    
    public static Test suite() {
        return buildTestSuite(DocumentHelperTest.class);
    }
    
    /**
     * tests getting a list of documents from catenated xml
     */
    public void testGetDocuments() throws Exception {
        
        // test short-circuiting
        assertEquals(0,LimeXMLDocumentHelper.getDocuments(null,1).size());
        assertEquals(0,LimeXMLDocumentHelper.getDocuments("",1).size());
        assertEquals(0,LimeXMLDocumentHelper.getDocuments("asfd",0).size());
        
        // test a valid document
        String threeResp = "<?xml version=\"1.0\"?>"+
        "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+
        "<audio genre=\"Rock\" identifier=\"def1.txt\" bitrate=\"190\" index=\"0\"/>"+
        "<audio genre=\"Classical\" identifier=\"def2.txt\" bitrate=\"2192\" index=\"1\"/>"+
        "<audio genre=\"Blues\" identifier=\"def.txt\" bitrate=\"192\" index=\"2\"/></audios>";
        
        List l = LimeXMLDocumentHelper.getDocuments(threeResp,3);
        assertEquals(1,l.size());
        
        LimeXMLDocument []docs = (LimeXMLDocument [])l.get(0);
        assertEquals(3,docs.length);
        for (int i = 0;i<docs.length;i++)
            assertNotNull(docs[i]);
        
        // test not enough xml
        l = LimeXMLDocumentHelper.getDocuments(threeResp,4);
        assertEquals(1,l.size());
        docs = (LimeXMLDocument [])l.get(0);
        assertEquals(4,docs.length);
        assertNull(docs[3]);
        
        // test too much xml
        l = LimeXMLDocumentHelper.getDocuments(threeResp,2);
        assertEquals(0,l.size());
        
        //test identical indices
        String identical = "<?xml version=\"1.0\"?>"+
        "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+
        "<audio genre=\"Rock\" identifier=\"def1.txt\" bitrate=\"190\" index=\"1\"/>"+
        "<audio genre=\"Classical\" identifier=\"def2.txt\" bitrate=\"2192\" index=\"1\"/>"+
        "<audio genre=\"Blues\" identifier=\"def.txt\" bitrate=\"192\" index=\"0\"/></audios>";
        l = LimeXMLDocumentHelper.getDocuments(identical,3);
        assertEquals(1,l.size());
        docs = (LimeXMLDocument [])l.get(0);
        assertEquals(3,docs.length);
        assertNotNull(docs[0]);
        assertNotNull(docs[1]);
        assertNull(docs[2]);
        
        // test invalid indices
        String invalidIndex = 
            "<?xml version=\"1.0\"?>"+
            "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+
            "<audio genre=\"Blues\" identifier=\"def.txt\" bitrate=\"192\" index=\"asdf\"/></audios>";
        l = LimeXMLDocumentHelper.getDocuments(invalidIndex,1);
        assertEquals(0,l.size());

        invalidIndex = 
            "<?xml version=\"1.0\"?>"+
            "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+
            "<audio genre=\"Blues\" identifier=\"def.txt\" bitrate=\"192\" index=\"-2\"/></audios>";
        l = LimeXMLDocumentHelper.getDocuments(invalidIndex,1);
        assertEquals(0,l.size());
        
        invalidIndex =
            "<?xml version=\"1.0\"?>"+
            "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+
            "<audio genre=\"Blues\" identifier=\"def.txt\" bitrate=\"192\"/></audios>";
        l = LimeXMLDocumentHelper.getDocuments(invalidIndex,1);
        assertEquals(0,l.size());
        
        
        // test invalid xml
        String invalidXML =
            "<?xml version=\"1.0\"?>"+
            "<audios xsi:noNamespaceSchemaLocation=\"http://www.limewire.com/schemas/audio.xsd\">"+
            "<audio genre=\"Blues\" identifier=\"def.txt\" bitrate=\"192\"/>";
        l = LimeXMLDocumentHelper.getDocuments(invalidIndex,1);
        assertEquals(0,l.size());
        
        
        // test valid documented catenated to an invalid one
        String oneValidOneNot = 
            threeResp+invalidXML;
        l = LimeXMLDocumentHelper.getDocuments(oneValidOneNot,3);
        assertEquals(1,l.size());
        docs = (LimeXMLDocument [])l.get(0);
        assertEquals(3,docs.length);
        for (int i = 0;i<docs.length;i++)
            assertNotNull(docs[i]);
        
        // test two valid documents
        
        String twoValid = threeResp+identical;
        l = LimeXMLDocumentHelper.getDocuments(twoValid,3);
        assertEquals(2,l.size());
        docs = (LimeXMLDocument [])l.get(0);
        assertEquals(3,docs.length);
        for (int i = 0;i<docs.length;i++)
            assertNotNull(docs[i]);
        docs = (LimeXMLDocument [])l.get(1);
        assertEquals(3,docs.length);
        assertNotNull(docs[0]);
        assertNotNull(docs[1]);
        assertNull(docs[2]);
        
    }
    
}
