source: sasview/test/sansdataloader/test/utest_cansas.py @ ea67541

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since ea67541 was ea67541, checked in by Jeff Krzywon <jeffery.krzywon@…>, 6 years ago

Fix for ticket #204 - processing instructions were not being set properly when saving as cansas data file.

  • Property mode set to 100644
File size: 9.0 KB
Line 
1"""
2    Unit tests for the new recursive cansas reader
3"""
4import warnings
5warnings.simplefilter("ignore")
6
7import unittest
8import numpy
9import sans.dataloader.readers.cansas_reader as cansas
10from sans.dataloader.loader import Loader
11from sans.dataloader.data_info import Data1D
12from sans.dataloader.readers.xml_reader import XMLreader
13from sans.dataloader.readers.cansas_reader import Reader
14from sans.dataloader.readers.cansas_constants import cansasConstants
15
16import os
17import sys
18import urllib2
19import StringIO
20
21from lxml import etree
22from xml.dom import minidom
23 
24CANSAS_FORMAT = cansasConstants.CANSAS_FORMAT
25CANSAS_NS = cansasConstants.CANSAS_NS
26   
27class cansas_reader(unittest.TestCase):
28   
29    def setUp(self):
30        self.loader = Loader()
31        self.xml_valid = "cansas_test_modified.xml"
32        self.xml_invalid = "cansas_test.xml"
33        self.cansas1d_badunits = "cansas1d_badunits.xml"
34        self.cansas1d = "cansas1d.xml"
35        self.cansas1d_slit = "cansas1d_slit.xml"
36        self.cansas1d_units = "cansas1d_units.xml"
37        self.isis_1_0 = "ISIS_1_0.xml"
38        self.isis_1_1 = "ISIS_1_1.xml"
39        self.isis_1_1_notrans = "ISIS_1_1_notrans.xml"
40        self.isis_1_1_doubletrans = "ISIS_1_1_doubletrans.xml"
41        self.schema_1_0 = "cansas1d_v1_0.xsd"
42        self.schema_1_1 = "cansas1d_v1_1.xsd"
43       
44   
45    def get_number_of_entries(self, dictionary, name, i):
46        if dictionary.get(name) is not None:
47            i += 1
48            name = name.split("_")[0]
49            name += "_{0}".format(i)
50            name = self.get_number_of_entries(dictionary, name, i)
51        return name
52       
53
54    def test_xml_validate(self):
55        string = "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n"
56        string += "\t<xsd:element name=\"a\" type=\"AType\"/>\n"
57        string += "\t<xsd:complexType name=\"AType\">\n"
58        string += "\t\t<xsd:sequence>\n"
59        string += "\t\t\t<xsd:element name=\"b\" type=\"xsd:string\" />\n"
60        string += "\t\t</xsd:sequence>\n"
61        string += "\t</xsd:complexType>\n"
62        string += "</xsd:schema>"
63        f = StringIO.StringIO(string)
64        xmlschema_doc = etree.parse(f)
65        xmlschema = etree.XMLSchema(xmlschema_doc)
66        valid = etree.parse(StringIO.StringIO('<a><b></b></a>'))
67        invalid = etree.parse(StringIO.StringIO('<a><c></c></a>'))
68        self.assertTrue(xmlschema.validate(valid))
69        self.assertFalse(xmlschema.validate(invalid))
70       
71       
72    def test_real_xml(self):
73        reader = XMLreader(self.xml_valid, self.schema_1_0)
74        valid = reader.validateXML()
75        if valid:
76            self.assertTrue(valid)
77        else:
78            self.assertFalse(valid)
79           
80           
81    def _check_data(self, data):
82        self.assertTrue(data.title == "TK49 c10_SANS")
83        self.assertTrue(data.x.size == 138)
84        self.assertTrue(len(data.meta_data) == 3)
85        self.assertTrue(data.detector[0].distance_unit == "mm")
86        self.assertTrue(data.detector[1].distance_unit == "mm")
87        self.assertTrue(data.detector[0].name == "HAB")
88        self.assertTrue(data.detector[1].name == "main-detector-bank")
89        self.assertTrue(data.detector[0].distance == 575.0)
90        self.assertTrue(data.detector[1].distance == 4145.02)
91        self.assertTrue(data.process[0].name == "Mantid generated CanSAS1D XML")
92        self.assertTrue(data.meta_data["xmlpreprocess"]["xml-stylesheet"] != None)
93       
94   
95    def _check_data_1_1(self, data):
96        spectrum = data.trans_spectrum[0]
97        self.assertTrue(len(spectrum.wavelength) == 138)
98       
99   
100    def test_cansas_xml(self):
101        filename = "isis_1_1_write_test.xml"
102        xmlreader = XMLreader(self.isis_1_1, self.schema_1_1)
103        valid = xmlreader.validateXML()
104        self.assertTrue(valid)
105        reader_generic = Loader()
106        dataloader = reader_generic.load(self.isis_1_1)
107        reader_cansas = Reader()
108        cansasreader = reader_cansas.read(self.isis_1_1)
109        for i in range(len(dataloader)):
110            self._check_data(dataloader[i])
111            self._check_data_1_1(dataloader[i])
112            self._check_data(cansasreader[i])
113            self._check_data_1_1(cansasreader[i])
114            reader_generic.save(filename, dataloader[i], None)
115            reader2 = Reader()
116            return_data = reader2.read(filename)
117            data_new = return_data
118            written_data = return_data[0]
119            self._check_data(written_data)
120           
121   
122    def test_double_trans_spectra(self):
123        xmlreader = XMLreader(self.isis_1_1_doubletrans, self.schema_1_1)
124        self.assertTrue(xmlreader.validateXML())
125        reader = Loader()
126        data = reader.load(self.isis_1_1_doubletrans)
127        for item in data:
128            self._check_data(item)
129   
130                   
131    def test_entry_name_recurse(self):
132        test_values = [1,2,3,4,5,6]
133        base_key = "key"
134        d = {}
135        for value in test_values:
136            new_key = self.get_number_of_entries(d, base_key, i = 0)
137            d[new_key] = value
138        self.assertTrue(len(d) == 6)
139       
140   
141    def test_load_cansas_file(self):
142        valid = []
143        reader1 = XMLreader(self.xml_valid, self.schema_1_0)
144        self.assertTrue(reader1.validateXML())
145        reader2 = XMLreader(self.xml_invalid, self.schema_1_0)
146        self.assertFalse(reader2.validateXML())
147        reader3 = XMLreader(self.xml_valid, self.schema_1_1)
148        self.assertFalse(reader3.validateXML())
149        reader4 = XMLreader(self.xml_invalid, self.schema_1_1)
150        self.assertFalse(reader4.validateXML())
151        reader5 = XMLreader(self.isis_1_0, self.schema_1_0)
152        self.assertTrue(reader5.validateXML())
153        reader6 = XMLreader(self.isis_1_1, self.schema_1_1)
154        self.assertTrue(reader6.validateXML())
155        reader7 = XMLreader(self.isis_1_1, self.schema_1_0)
156        self.assertFalse(reader7.validateXML())
157       
158       
159    def test_old_cansas_files(self):
160        reader1 = XMLreader(self.cansas1d, self.schema_1_0)
161        self.assertTrue(reader1.validateXML())
162        file_loader = Loader()
163        file1 = file_loader.load(self.cansas1d)
164        reader2 = XMLreader(self.cansas1d_units, self.schema_1_0)
165        self.assertTrue(reader2.validateXML())
166        reader3 = XMLreader(self.cansas1d_badunits, self.schema_1_0)
167        self.assertTrue(reader3.validateXML())
168        reader4 = XMLreader(self.cansas1d_slit, self.schema_1_0)
169        self.assertTrue(reader4.validateXML())
170       
171    def test_save_cansas_v1_0(self):
172        filename = "isis_1_0_write_test.xml"
173        xmlreader = XMLreader(self.isis_1_0, self.schema_1_0)
174        valid = xmlreader.validateXML()
175        self.assertTrue(valid)
176        reader_generic = Loader()
177        dataloader = reader_generic.load(self.isis_1_0)
178        reader_cansas = Reader()
179        cansasreader = reader_cansas.read(self.isis_1_0)
180        for i in range(len(dataloader)):
181            self._check_data(dataloader[i])
182            self._check_data(cansasreader[i])
183            reader_generic.save(filename, dataloader[i], None)
184            reader2 = Reader()
185            return_data = reader2.read(filename)
186            data_new = return_data
187            written_data = return_data[0]
188            self._check_data(written_data)
189       
190       
191    def test_processing_instructions(self):
192        reader = XMLreader(self.isis_1_1, self.schema_1_1)
193        valid = reader.validateXML()
194        if valid:
195            ## find the processing instructions and make into a dictionary
196            dic = self.getProcessingInstructions(reader)
197            self.assertTrue(dic == {'xml-stylesheet': 'type="text/xsl" href="cansas1d.xsl" '})
198           
199            xml = "<test><a><b><c></c></b></a></test>"
200            xmldoc = minidom.parseString(xml)
201           
202            ## take the processing instructions and put them back in
203            xmldoc = self.setProcessingInstructions(xmldoc, dic)
204            xml_output = xmldoc.toprettyxml()
205           
206   
207    def setProcessingInstructions(self, minidomObject, dic):
208        xmlroot = minidomObject.firstChild
209        for item in dic:
210            pi = minidomObject.createProcessingInstruction(item, dic[item])
211            minidomObject.insertBefore(pi, xmlroot)
212        return minidomObject
213   
214   
215    def getProcessingInstructions(self, XMLreaderObject):
216        dict = {}
217        pi = XMLreaderObject.xmlroot.getprevious()
218        i = 0
219        while pi is not None:
220            attr = {}
221            pi_name = ""
222            pi_string = etree.tostring(pi)
223            if isinstance(pi_string, str):
224                pi_string = pi_string.replace("<?", "").replace("?>", "")
225                split = pi_string.split(" ", 1)
226                pi_name = split[0]
227                attr = split[1]
228            dict[pi_name] = attr
229            pi = pi.getprevious()
230        return dict
231       
232if __name__ == '__main__':
233    unittest.main()   
Note: See TracBrowser for help on using the repository browser.