/* * Copyright (C) 2007 Snorre Gylterud, Stein Magnus Jodal, Johannes Knutsen, * Erik Bagge Ottesen, Ralf Bjarne Taraldset, and Iterate AS * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. */ package no.ntnu.mmfplanner.util; import static org.junit.Assert.*; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.net.URL; import java.util.regex.Pattern; import javax.swing.JMenuItem; import javax.swing.JPanel; import no.ntnu.mmfplanner.ProjectTestFixture; import no.ntnu.mmfplanner.ui.TabPanePanelPlacement; import nu.xom.Builder; import nu.xom.Element; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; /** * Test suite for {@link XmlSerializer} */ public class XmlSerializerTest extends ProjectTestFixture { TabPanePanelPlacement placement; @Before public void setUp() { placement = new TabPanePanelPlacement(new JMenuItem()); placement.add("projectPropPanel", "Project Properties", TabPanePanelPlacement.TYPE_INPUT, TabPanePanelPlacement.PLACEMENT_UPPER, true, new JPanel()); placement.add("mmfTablePanel", "MMF Table", TabPanePanelPlacement.TYPE_OUTPUT, TabPanePanelPlacement.PLACEMENT_LOWER, false, new JPanel()); } /** * Test method for * {@link no.ntnu.mmfplanner.util.XmlSerializer#projectToElement(no.ntnu.mmfplanner.model.Project)}. */ @Test public void testProjectToElement() { String exp = "<project><name>Test project</name><periods>12</periods><" + "interestrate>0.0080</interestrate><nextid>C</nextid><maxmmfs>" + "1</maxmmfs><catego" + "ries><category id=\"0\"><name>Online Travel Agency</name><c" + "olor>FF0000</color><parent /></category><category id=\"1\">" + "<name>Trip Planner</name><color>0000FF</color><parent>0</pa" + "rent></category></categories><mmfs><mmf id=\"A\"><name>Test" + " A</name><period>2</period><locked>true</locked><swimlane>1</swimlane><category_ref " + "/><precursors /><revenues><revenue><period>1</period><value" + ">-200</value></revenue><revenue><period>2</period><value>-2" + "00</value></revenue><revenue><period>3</period><value>100</" + "value></revenue><revenue><period>4</period><value>120</valu" + "e></revenue><revenue><period>5</period><value>140</value></" + "revenue><revenue><period>6</period><value>160</value></reve" + "nue><revenue><period>7</period><value>200</value></revenue>" + "<revenue><period>8</period><value>220</value></revenue><rev" + "enue><period>9</period><value>240</value></revenue><revenue" + "><period>10</period><value>300</value></revenue><revenue><p" + "eriod>11</period><value>320</value></revenue><revenue><peri" + "od>12</period><value>340</value></revenue><revenue><period>" + "13</period><value>1000</value></revenue><revenue><period>14" + "</period><value>2000</value></revenue><revenue><period>15</" + "period><value>3000</value></revenue></revenues></mmf><mmf i" + "d=\"B\"><name>Test B</name><period>1</period><locked>false</locked><swimlane>1</s" + "wimlane><category_ref>0</category_ref><precursors>A</precursors><re" + "venues /></mmf></mmfs></project>"; Element e = XmlSerializer.projectToElement(project); assertEquals(exp, e.toXML()); } /** * Test method for * {@link no.ntnu.mmfplanner.util.XmlSerializer#categoryToElement(no.ntnu.mmfplanner.model.Project, no.ntnu.mmfplanner.model.Category)}. */ @Test public void testCategoryToElement() { String exp1 = "<category id=\"0\"><name>Online Travel Agency</name><co" + "lor>FF0000</color><parent /></category>"; String exp2 = "<category id=\"1\"><name>Trip Planner</name><color>0000" + "FF</color><parent>0</parent></category>"; Element e1 = XmlSerializer.categoryToElement(project, category1); assertEquals(exp1, e1.toXML()); Element e2 = XmlSerializer.categoryToElement(project, category2); assertEquals(exp2, e2.toXML()); } /** * Test method for * {@link no.ntnu.mmfplanner.util.XmlSerializer#tabPanePanelPlacementToElement(no.ntnu.mmfplanner.model.Project)}. */ @Test public void testTabPanePanelPlacementToElement() { String exp1 = "<panels><panel id=\"projectPropPanel\"><visible>true</visible>" + "<placement>upper</placement></panel><panel id=\"mmfTablePanel\"><visible>false</visible>" + "<placement>lower</placement></panel></panels>"; Element e1 = XmlSerializer.tabPanePanelPlacementToElement(placement); assertEquals(exp1, e1.toXML()); } /** * Test method for * {@link no.ntnu.mmfplanner.util.XmlSerializer#mmfToElement(no.ntnu.mmfplanner.model.Project, no.ntnu.mmfplanner.model.Mmf)}. */ @Test public void testMmfToElement() { String expB = "<mmf id=\"B\"><name>Test B</name><period>1</period><locked>false</locked><swi" + "mlane>1</swimlane><category_ref>0</category_ref><precursors>A</prec" + "ursors><revenues /></mmf>"; String expA = "<mmf id=\"A\"><name>Test A</name><period>2</period><locked>true</locked><swi" + "mlane>1</swimlane><category_ref /><precursors /><revenues><reve" + "nue><period>1</period><value>-200</value></revenue><revenue" + "><period>2</period><value>-200</value></revenue><revenue><p" + "eriod>3</period><value>100</value></revenue><revenue><perio" + "d>4</period><value>120</value></revenue><revenue><period>5<" + "/period><value>140</value></revenue><revenue><period>6</per" + "iod><value>160</value></revenue><revenue><period>7</period>" + "<value>200</value></revenue><revenue><period>8</period><val" + "ue>220</value></revenue><revenue><period>9</period><value>2" + "40</value></revenue><revenue><period>10</period><value>300<" + "/value></revenue><revenue><period>11</period><value>320</va" + "lue></revenue><revenue><period>12</period><value>340</value" + "></revenue><revenue><period>13</period><value>1000</value><" + "/revenue><revenue><period>14</period><value>2000</value></r" + "evenue><revenue><period>15</period><value>3000</value></rev" + "enue></revenues></mmf>"; Element eB = XmlSerializer.mmfToElement(project, mmfB); assertEquals(expB, eB.toXML()); Element eA = XmlSerializer.mmfToElement(project, mmfA); assertEquals(expA, eA.toXML()); } /** * Test method for * {@link no.ntnu.mmfplanner.util.XmlSerializer#writeWorkspace(no.ntnu.mmfplanner.model.Project, java.io.OutputStream)}. */ @Ignore("Doctype is not yet used in the serialization.") @Test public void testWriteProject() throws Exception { String exp = "<\\?xml version=\"1.0\" encoding=\"UTF-8\"\\?>\\s*<!DOCTYPE mmfproject SYSTEM \"https://github.com/jodal/mmfplanner/raw/HEAD/dist/mmfproject.dtd\">\\s*<mmfproject>\\s*<project>.+</project>\\s*<settings>.+</settings>\\s*</mmfproject>\\s*"; Pattern pexp = Pattern.compile(exp, Pattern.DOTALL); int expSize = 3086; ByteArrayOutputStream os = new ByteArrayOutputStream(); XmlSerializer.writeWorkspace(placement, project, os); String xml = os.toString("UTF-8"); assertTrue(pexp.matcher(xml).matches()); assertEquals(expSize, os.size()); assertEquals(expSize, xml.length()); // UTF-8 os.reset(); project.setName("ÆØÅæøå"); XmlSerializer.writeWorkspace(placement, project, os); xml = os.toString("UTF-8"); assertTrue(pexp.matcher(xml).matches()); assertTrue(xml.contains("<name>ÆØÅæøå</name>")); assertEquals(expSize, os.size()); assertEquals(expSize - 6, xml.length()); } @Test public void testDocumentTypeDefinition() throws Exception { ByteArrayOutputStream os = new ByteArrayOutputStream(); XmlSerializer.writeWorkspace(placement, project, os); ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); XMLReader xerces = XMLReaderFactory .createXMLReader("com.sun.org.apache.xerces.internal.parsers.SAXParser"); xerces.setFeature("http://apache.org/xml/features/validation/schema", true); URL schemaUrl = ClassLoader.getSystemResource("mmfproject.schema"); xerces.setProperty( "http://java.sun.com/xml/jaxp/properties/schemaSource", schemaUrl.getFile()); Builder parser = new Builder(xerces, true); parser.build(is); } @Test public void testXmlSchema() throws Exception { ByteArrayOutputStream os = new ByteArrayOutputStream(); XmlSerializer.writeWorkspace(placement, project, os); ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); XMLReader xerces = XMLReaderFactory .createXMLReader("com.sun.org.apache.xerces.internal.parsers.SAXParser"); xerces.setFeature("http://apache.org/xml/features/validation/schema", true); URL schemaUrl = ClassLoader.getSystemResource("mmfproject.schema"); xerces.setProperty( "http://java.sun.com/xml/jaxp/properties/schemaSource", schemaUrl.getFile()); Builder parser = new Builder(xerces, true); parser.build(is); } }