Source code for sciunit.unit_test.test_tests

"""Unit tests for (sciunit) tests and test suites"""

import unittest

from sciunit import TestSuite
from sciunit.tests import RangeTest, TestM2M
from sciunit.models.examples import ConstModel, UniformModel
from sciunit.scores import BooleanScore, FloatScore
from sciunit.scores import FloatScore
from sciunit.capabilities import ProducesNumber

from .base import SuiteBase

[docs]class TestsTestCase(unittest.TestCase): """Unit tests for the sciunit module"""
[docs] def setUp(self): self.M = UniformModel self.T = RangeTest
[docs] def test_get_test_description(self): t = self.T([2, 3]) t.describe() t.description = "Lorem Ipsum" t.describe() class MyTest(self.T): """Lorem Ipsum""" pass t = MyTest([2, 3]) t.description = None self.assertEqual(t.describe(),"Lorem Ipsum")
[docs] def test_check_model_capabilities(self): t = self.T([2, 3]) m = self.M(2, 3) t.check(m)
[docs] def test_rangetest(self): range_2_3_test = RangeTest(observation=[2, 3]) one_model = ConstModel(2.5) self.assertTrue(range_2_3_test.check_capabilities(one_model)) score = range_2_3_test.judge(one_model) self.assertTrue(isinstance(score, BooleanScore)) self.assertEqual(score.score,True) self.assertTrue(score.test is range_2_3_test) self.assertTrue(score.model is one_model)
[docs]class TestSuitesTestCase(SuiteBase, unittest.TestCase): """Unit tests for the sciunit module"""
[docs] def test_testsuite(self): t1 = self.T([2,3]) t2 = self.T([5,6]) m1 = self.M(2,3) m2 = self.M(5,6) t = TestSuite([t1,t2]) t.judge([m1,m2]) t = TestSuite([t1,t2],skip_models=[m1],include_models=[m2]) t.judge([m1,m2])
[docs] def test_testsuite_hooks(self): t1 = self.T([2,3]) t1.hook_called = False t2 = self.T([5,6]) m = self.M(2,3) def f(test, tests, score, a=None): self.assertEqual(score,True) self.assertEqual(a,1) t1.hook_called = True ts = TestSuite([t1,t2],name='MySuite', hooks={t1: {'f':f, 'kwargs':{'a':1}} }) ts.judge(m) self.assertEqual(t1.hook_called,True)
[docs] def test_testsuite_from_observations(self): m = self.M(2,3) ts = TestSuite.from_observations([(self.T,[2,3]), (self.T,[5,6])], name="MySuite") ts.judge(m)
[docs] def test_testsuite_set_verbose(self): t1 = self.T([2,3]) t2 = self.T([5,6]) t = TestSuite([t1,t2]) t.set_verbose(True) self.assertEqual(t1.verbose,True) self.assertEqual(t2.verbose,True)
[docs] def test_testsuite_serialize(self): tests = [RangeTest(observation=(x,x+3)) for x in [1,2,3,4]] ts = TestSuite(tests, name='RangeSuite') self.assertTrue(isinstance(ts.json(),str))
[docs]class M2MsTestCase(unittest.TestCase): """Tests for the M2M flavor of tests and test suites"""
[docs] def setUp(self): self.myModel1 = ConstModel(100.0, "Model1") self.myModel2 = ConstModel(110.0, "Model2") class NumberTest_M2M(TestM2M): """Dummy Test""" score_type = FloatScore description = ("Tests the parameter 'value' between two models") def __init__(self, observation=None, name="ValueTest-M2M"): TestM2M.__init__(self,observation,name) self.required_capabilities += (ProducesNumber,) def generate_prediction(self, model, verbose=False): """Implementation of sciunit.Test.generate_prediction.""" prediction = model.produce_number() return prediction def compute_score(self, prediction1, prediction2): """Implementation of sciunit.Test.score_prediction.""" score = FloatScore(prediction1 - prediction2) score.description = "Difference between model predictions" return score self.NumberTest_M2M = NumberTest_M2M
[docs] def test_testm2m_with_observation(self): myTest = self.NumberTest_M2M(observation=95.0) myScore = myTest.judge([self.myModel1, self.myModel2]) # Test model vs observation self.assertEqual(myScore[myTest][self.myModel1], -5.0) self.assertEqual(myScore[self.myModel1][myTest], 5.0) self.assertEqual(myScore["observation"][self.myModel2], -15.0) self.assertEqual(myScore[self.myModel2]["observation"], 15.0) # Test model vs model self.assertEqual(myScore[self.myModel1][self.myModel2], -10.0) self.assertEqual(myScore[self.myModel2][self.myModel1], 10.0)
[docs] def test_testm2m_without_observation(self): myTest = self.NumberTest_M2M(observation=None) myScore = myTest.judge([self.myModel1, self.myModel2]) # Test model vs model; different ways of specifying individual scores self.assertEqual(myScore[self.myModel1][self.myModel2], -10.0) self.assertEqual(myScore[self.myModel2][self.myModel1], 10.0) self.assertEqual(myScore["Model1"][self.myModel2], -10.0) self.assertEqual(myScore["Model2"][self.myModel1], 10.0) self.assertEqual(myScore[self.myModel1][self.myModel1], 0.0) self.assertEqual(myScore["Model2"]["Model2"], 0.0)