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
RevLine 
[4bdd4fdb]1"""
2    Unit tests for the new recursive cansas reader
3"""
4import warnings
5warnings.simplefilter("ignore")
6
[eda8972]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
[ac5b69d]12from sans.dataloader.readers.cansas_constants import CansasConstants
[4bdd4fdb]13
14import os
15import sys
[eda8972]16import urllib2
17import StringIO
[ac5b69d]18import pylint as pylint
19import unittest
20import numpy
[4bdd4fdb]21
22from lxml import etree
[ea67541]23from xml.dom import minidom
[4bdd4fdb]24 
[ac5b69d]25CANSAS_FORMAT = CansasConstants.CANSAS_FORMAT
26CANSAS_NS = CansasConstants.CANSAS_NS
[4bdd4fdb]27   
28class cansas_reader(unittest.TestCase):
29   
30    def setUp(self):
31        self.loader = Loader()
[eda8972]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"
[76cd1ae]41        self.isis_1_1_doubletrans = "ISIS_1_1_doubletrans.xml"
[eda8972]42        self.schema_1_0 = "cansas1d_v1_0.xsd"
43        self.schema_1_1 = "cansas1d_v1_1.xsd"
[75eeb425]44       
[eda8972]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
[ea67541]53       
[eda8972]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))
[4bdd4fdb]71       
[75eeb425]72       
[eda8972]73    def test_real_xml(self):
74        reader = XMLreader(self.xml_valid, self.schema_1_0)
[ac5b69d]75        valid = reader.validate_xml()
[eda8972]76        if valid:
77            self.assertTrue(valid)
78        else:
79            self.assertFalse(valid)
[75eeb425]80           
[76cd1ae]81           
82    def _check_data(self, data):
83        self.assertTrue(data.title == "TK49 c10_SANS")
84        self.assertTrue(data.x.size == 138)
[ea67541]85        self.assertTrue(len(data.meta_data) == 3)
[76cd1ae]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")
[2e3b055]93        self.assertTrue(data.meta_data["xmlpreprocess"] != None)
[76cd1ae]94       
[c6ca23d]95   
96    def _check_data_1_1(self, data):
97        spectrum = data.trans_spectrum[0]
98        self.assertTrue(len(spectrum.wavelength) == 138)
[4bdd4fdb]99       
[c6ca23d]100   
[eda8972]101    def test_cansas_xml(self):
[75eeb425]102        filename = "isis_1_1_write_test.xml"
[eda8972]103        xmlreader = XMLreader(self.isis_1_1, self.schema_1_1)
[ac5b69d]104        valid = xmlreader.validate_xml()
105        xmlreader.set_processing_instructions()
[eda8972]106        self.assertTrue(valid)
[2e3b055]107        fo = open(self.isis_1_1)
108        str = fo.read()
[76cd1ae]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])
[c6ca23d]115            self._check_data_1_1(dataloader[i])
[76cd1ae]116            self._check_data(cansasreader[i])
[c6ca23d]117            self._check_data_1_1(cansasreader[i])
[76cd1ae]118            reader_generic.save(filename, dataloader[i], None)
[2e3b055]119            fo = open(filename)
120            str = fo.read()
121            reader2 = Loader()
122            return_data = reader2.load(filename)
[76cd1ae]123            written_data = return_data[0]
124            self._check_data(written_data)
[2e3b055]125   
[76cd1ae]126   
127    def test_double_trans_spectra(self):
128        xmlreader = XMLreader(self.isis_1_1_doubletrans, self.schema_1_1)
[ac5b69d]129        self.assertTrue(xmlreader.validate_xml())
[76cd1ae]130        reader = Loader()
131        data = reader.load(self.isis_1_1_doubletrans)
132        for item in data:
133            self._check_data(item)
134   
[eda8972]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)
[75eeb425]144       
[eda8972]145   
146    def test_load_cansas_file(self):
147        valid = []
148        reader1 = XMLreader(self.xml_valid, self.schema_1_0)
[ac5b69d]149        self.assertTrue(reader1.validate_xml())
[eda8972]150        reader2 = XMLreader(self.xml_invalid, self.schema_1_0)
[ac5b69d]151        self.assertFalse(reader2.validate_xml())
[eda8972]152        reader3 = XMLreader(self.xml_valid, self.schema_1_1)
[ac5b69d]153        self.assertFalse(reader3.validate_xml())
[eda8972]154        reader4 = XMLreader(self.xml_invalid, self.schema_1_1)
[ac5b69d]155        self.assertFalse(reader4.validate_xml())
[eda8972]156        reader5 = XMLreader(self.isis_1_0, self.schema_1_0)
[ac5b69d]157        self.assertTrue(reader5.validate_xml())
[eda8972]158        reader6 = XMLreader(self.isis_1_1, self.schema_1_1)
[ac5b69d]159        self.assertTrue(reader6.validate_xml())
[eda8972]160        reader7 = XMLreader(self.isis_1_1, self.schema_1_0)
[ac5b69d]161        self.assertFalse(reader7.validate_xml())
[75eeb425]162       
[ea67541]163       
[eda8972]164    def test_old_cansas_files(self):
165        reader1 = XMLreader(self.cansas1d, self.schema_1_0)
[ac5b69d]166        self.assertTrue(reader1.validate_xml())
[ea67541]167        file_loader = Loader()
168        file1 = file_loader.load(self.cansas1d)
[eda8972]169        reader2 = XMLreader(self.cansas1d_units, self.schema_1_0)
[ac5b69d]170        self.assertTrue(reader2.validate_xml())
[eda8972]171        reader3 = XMLreader(self.cansas1d_badunits, self.schema_1_0)
[ac5b69d]172        self.assertTrue(reader3.validate_xml())
[eda8972]173        reader4 = XMLreader(self.cansas1d_slit, self.schema_1_0)
[ac5b69d]174        self.assertTrue(reader4.validate_xml())
[4bdd4fdb]175       
[2e3b055]176   
[c6ca23d]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)
[ac5b69d]180        valid = xmlreader.validate_xml()
[c6ca23d]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]
[2e3b055]193            xmlwrite = XMLreader(filename, self.schema_1_0)
[ac5b69d]194            valid = xmlreader.validate_xml()
[2e3b055]195            self.assertTrue(valid)
[c6ca23d]196            self._check_data(written_data)
197       
[ea67541]198       
199    def test_processing_instructions(self):
200        reader = XMLreader(self.isis_1_1, self.schema_1_1)
[ac5b69d]201        valid = reader.validate_xml()
[ea67541]202        if valid:
203            ## find the processing instructions and make into a dictionary
[ac5b69d]204            dic = self.get_processing_instructions(reader)
[ea67541]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
[ac5b69d]211            xmldoc = self.set_processing_instructions(xmldoc, dic)
[ea67541]212            xml_output = xmldoc.toprettyxml()
213           
214   
[ac5b69d]215    def set_processing_instructions(self, minidom_object, dic):
216        xmlroot = minidom_object.firstChild
[ea67541]217        for item in dic:
[ac5b69d]218            pi = minidom_object.createProcessingInstruction(item, dic[item])
219            minidom_object.insertBefore(pi, xmlroot)
220        return minidom_object
[ea67541]221   
222   
[ac5b69d]223    def get_processing_instructions(self, xml_reader_object):
[ea67541]224        dict = {}
[ac5b69d]225        pi = xml_reader_object.xmlroot.getprevious()
[ea67541]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       
[2e3b055]240
[4bdd4fdb]241if __name__ == '__main__':
[eda8972]242    unittest.main()   
Note: See TracBrowser for help on using the repository browser.