source: sasview/sansrealspace/src/realspace/test/simulation_stimuli.py @ f98961f

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 f98961f was ba1d1e9, checked in by Mathieu Doucet <doucetm@…>, 17 years ago

moving sansrealspace to trunk

  • Property mode set to 100644
File size: 10.1 KB
Line 
1"""Automated testing for simulation
2
3    To be compatible with testcase_generator, a simulus
4    class must have:
5        setup(self):  to initialize the test-case
6        getRandomStimulus(self): to get a random stimulus name
7        stimuli that inherit from the Stimulus class
8       
9    @copyright: University of Tennessee, 2007
10    @license: This software is provided as part of the DANSE project.
11
12"""
13
14import testcase_generator as generator
15from testcase_generator import Stimulus
16try:
17    import VolumeCanvas
18    print "Testing local VolumeCanvas\n"
19except:
20    import sans.realspace.VolumeCanvas as VolumeCanvas
21
22def randomModel():
23    """ Return a random model name """
24    from random import random
25    from math import floor
26   
27    model_list = ['sphere', 'cylinder', 'ellipsoid', 'singlehelix']
28    rnd_id = int(floor(random()*len(model_list)))
29   
30    return model_list[rnd_id]
31
32
33class Simulation:
34    """Simulation testing class"""
35   
36    # Probability of stopping a test case without
37    # adding additional stimuli
38    end_frequency = 0.1
39   
40    def __init__(self):
41        self.end_flag = False
42       
43    def reset(self):
44        self.end_flag = False
45   
46    def setup(self):
47        """Setup the canvas for stimuli application"""
48        return VolumeCanvas.VolumeCanvas()
49   
50    def getRandomStimulus(self):
51        """Return the name of a random stimulus"""
52       
53        from random import random
54       
55        # If the end flag is up, compute I(q) one last time
56        if self.end_flag == True:
57            return None
58       
59        # Get the list of stimuli
60        attrs = dir(self)
61        stim_list = []
62       
63        # Get the list of simuli and
64        # compute the total normalization
65        sum = 0
66        for item in attrs:
67            if item.endswith('Stimulus'):
68                obj = getattr(self, item)
69                if hasattr(obj, 'frequency'):
70                    stim_list.append(item)
71                    sum += getattr(self, item).frequency
72       
73        # Choose a stimulus
74        rnd = random()
75       
76        # Check if we need to stop
77        if rnd < self.end_frequency:
78            self.end_flag = True
79            return "GetIq"
80       
81        run_sum = 0
82        for item in stim_list:
83            run_sum += getattr(self, item).frequency/sum 
84            if run_sum >= rnd:
85                pos = item.index('Stimulus')
86               
87                return item[0:pos]
88       
89    class AddStimulus(Stimulus):
90        """Add an object to the canvas"""
91
92        frequency = 1.0
93       
94        def __call__(self, canvas):
95            """Apply stimulus"""
96            report = generator.StimulusReport(tag=self.name)
97       
98            # Select random model
99            add_model = randomModel()
100
101            # Add the model
102            handle = canvas.add(add_model)
103           
104            # Check that it is in the list of objects
105            if handle in canvas.getShapeList():
106                report.passed = 1
107            else:
108                report.log = "Add: tried to add %s" % add_model
109           
110            report.trace = "Added %s" % add_model
111           
112            return canvas, report
113   
114    class GetParamStimulus(Stimulus):
115        """Get the value of a canvas or shape parameter"""
116
117        frequency = 1.0
118       
119        def __call__(self, canvas):
120            """Apply stimulus"""
121            from random import random
122            import math
123           
124            report = generator.StimulusReport(tag=self.name)
125       
126            # Read a parameter
127            #TODO: access shape parameters
128            rnd = random()
129            i_rnd = int(math.floor(rnd*len(canvas.params)))
130            par_name = canvas.params.keys()[i_rnd]
131            value = canvas.getParam(par_name)
132           
133            # Check that it is in the list of objects
134            try:
135                float(value)
136                report.passed = 1
137            except:
138                report.log = "get: bad value for [%s]" % par_name
139           
140            report.trace = "Read %s" % par_name
141           
142            return canvas, report
143   
144    class GetIqStimulus(Stimulus):
145        """Calculate I(q)"""
146
147        frequency = 1.0
148       
149        def __call__(self, canvas):
150            report = generator.StimulusReport(tag=self.name)
151           
152            # Check that a float is returned
153            # Validation testing will be done elsewhere
154            value = canvas.getIq(0.1)
155           
156            # Check that it is in the list of objects
157            try:
158                float(value)
159                report.passed = 1
160            except:
161                report.log = "GetIq: bad value for Iq "+str(value)
162           
163            report.trace = "I(q) = %g" % value
164            return canvas, report
165   
166    class SetCanvasParamStimulus(Stimulus):
167        """Set the value of a canvas parameter"""
168
169        frequency = 1.0
170       
171        def __call__(self, canvas):
172            """Apply stimulus"""
173            from random import random
174            import math
175           
176            report = generator.StimulusReport(tag=self.name)
177       
178            # Read a parameter
179            rnd = random()
180            i_rnd = int(math.floor(rnd*len(canvas.params)))
181            par_name = canvas.params.keys()[i_rnd]
182           
183            # Get current value
184            current = canvas.getParam(par_name)
185           
186            # Set new value
187            rnd2 = random()
188            new_value = current*(1.0+rnd2)
189            canvas.setParam(par_name, new_value)
190           
191            # Read it back
192            current = canvas.getParam(par_name)
193           
194            # Check that the new value is correct
195            if current == new_value:
196                report.passed = 1
197            else:
198                report.log = "get: bad value for [%s]" % par_name
199           
200            report.trace = "Read %s" % par_name
201           
202            return canvas, report
203   
204    class SetShapeParamStimulus(Stimulus):
205        """Set the value of a canvas parameter"""
206
207        frequency = 1.0
208       
209        def __call__(self, canvas):
210            """Apply stimulus"""
211            from random import random
212            import math
213           
214            report = generator.StimulusReport(tag=self.name)
215       
216            # Read a parameter
217            rnd = random()
218            shape_list = canvas.getShapeList()
219
220            if len(shape_list)==0:
221                # No object available, let's test an error condition
222                try:
223                    canvas.setParam("shape0.test-radius", 1.0)
224                    report.log = "SetShapeParam: set didn't throw exception"
225                except:
226                    report.passed = 1
227                report.trace = "SetShapeParam: testing failure behavior"
228               
229            else: 
230                i_rnd = int(math.floor(rnd*len(shape_list)))
231                shape_name = shape_list[i_rnd]
232               
233                found = False
234                while found==False:
235                    rnd2 = random()
236                    par_keys = canvas.shapes[shape_name].params.keys()
237                    i_rnd2 = int(math.floor(rnd2*(len(par_keys))))
238                   
239                    short_name = par_keys[i_rnd2]
240                    par_name = "%s.%s" % (shape_name, short_name)
241                    if not short_name.lower() == "type":
242                        found= True
243               
244                # Get current value
245                current = canvas.getParam(par_name)
246               
247                # Set new value
248                if short_name in ['orientation', 'center']:
249                    new_value = [random(), random(), random()]
250                else:
251                    new_value = current*(1.0+random())
252
253                canvas.setParam(par_name, new_value)
254               
255                # Read it back
256                current = canvas.getParam(par_name)
257               
258                # Check that the new value is correct
259                if current == new_value:
260                    report.passed = 1
261                else:
262                    report.log = "get: bad value for [%s]" % par_name
263               
264                report.trace = "Read %s" % par_name
265           
266            return canvas, report
267   
268
269    class RemoveStimulus(Stimulus):
270        """Calculate I(q)"""
271
272        frequency = 1.0
273       
274        def __call__(self, canvas):
275            from random import random
276            import math
277           
278            report = generator.StimulusReport(tag=self.name)
279           
280            # Get list of shapes
281            if len(canvas.shapes)>0:
282                rnd = random()
283                i_rnd = int(math.floor(rnd*len(canvas.shapes)))
284                shape_name = canvas.shapes.keys()[i_rnd]
285               
286                canvas.delete(shape_name)
287                if shape_name in canvas.shapes.keys() \
288                    or shape_name in canvas.getShapeList():
289                    report.log = "Remove: object was not removed"
290                else:
291                    report.passed = 1
292               
293            else:
294                # No shape to remove: test bad remove call
295                try:
296                    canvas.delete("test-shape")
297                    report.log = "Remove: delete didn't throw exception"
298                except:
299                    report.passed = 1
300                report.trace = "Remove: testing failure behavior"
301           
302            return canvas, report
303   
304
305
306if __name__ == '__main__':
307    import sys
308   
309    stimuli = Simulation()
310   
311    if len(sys.argv)>1:
312        #t = generator.TestCase(stimuli, filename = "test-case.xml")
313        t = generator.TestCase(stimuli, filename = sys.argv[1])
314        print "Test passed =", t.run() 
315    else:   
316        g = generator.TestCaseGenerator(stimuli)
317        g.generateAndRun(200)
318   
319
320   
321   
Note: See TracBrowser for help on using the repository browser.