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

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 ac5b69d was ac5b69d, checked in by Jeff Krzywon <jeffery.krzywon@…>, 10 years ago

Ticket #249 fix: Saving and loading projects and analysis is now working.

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