def test_subclass_specialization(self): os = OverloadSelector() self.assertTrue(issubclass(types.Sequence, types.Container)) os.append(1, (types.Container, types.Container,)) lstty = types.List(types.boolean) self.assertEqual(os.find((lstty, lstty)), 1) os.append(2, (types.Container, types.Sequence,)) self.assertEqual(os.find((lstty, lstty)), 2)
def test_subclass_specialization(self): os = OverloadSelector() self.assertTrue(issubclass(types.Sequence, types.Container)) os.append(1, (types.Container, types.Container)) lstty = types.List(types.boolean) self.assertEqual(os.find((lstty, lstty)), 1) os.append(2, (types.Container, types.Sequence)) self.assertEqual(os.find((lstty, lstty)), 2)
def test_cache(self): os = OverloadSelector() self.assertEqual(len(os._cache), 0) os.append(1, (types.Any,)) self.assertEqual(os.find((types.int32,)), 1) self.assertEqual(len(os._cache), 1) os.append(2, (types.Integer,)) self.assertEqual(len(os._cache), 0) self.assertEqual(os.find((types.int32,)), 2) self.assertEqual(len(os._cache), 1)
def test_cache(self): os = OverloadSelector() self.assertEqual(len(os._cache), 0) os.append(1, (types.Any,)) self.assertEqual(os.find((types.int32,)), 1) self.assertEqual(len(os._cache), 1) os.append(2, (types.Integer,)) self.assertEqual(len(os._cache), 0) self.assertEqual(os.find((types.int32,)), 2) self.assertEqual(len(os._cache), 1)
def test_ambiguous_detection(self): os = OverloadSelector() # unambiguous signatures os.append(1, (types.Any, types.Boolean)) os.append(2, (types.Integer, types.Boolean)) self.assertEqual(os.find((types.boolean, types.boolean)), 1) # not implemented with self.assertRaises(NotImplementedError) as raises: os.find((types.boolean, types.int32)) # generic os.append(3, (types.Any, types.Any)) self.assertEqual(os.find((types.boolean, types.int32)), 3) self.assertEqual(os.find((types.boolean, types.boolean)), 1) # add ambiguous signature; can match (bool, any) and (any, bool) os.append(4, (types.Boolean, types.Any)) with self.assertRaises(TypeError) as raises: os.find((types.boolean, types.boolean)) self.assertIn('2 ambiguous signatures', str(raises.exception)) # disambiguous os.append(5, (types.boolean, types.boolean)) self.assertEqual(os.find((types.boolean, types.boolean)), 5)
def test_ambiguous_detection(self): os = OverloadSelector() # unambiguous signatures os.append(1, (types.Any, types.Boolean)) os.append(2, (types.Integer, types.Boolean)) self.assertEqual(os.find((types.boolean, types.boolean)), 1) # not implemented with self.assertRaises(NotImplementedError) as raises: os.find((types.boolean, types.int32)) # generic os.append(3, (types.Any, types.Any)) self.assertEqual(os.find((types.boolean, types.int32)), 3) self.assertEqual(os.find((types.boolean, types.boolean)), 1) # add ambiguous signature; can match (bool, any) and (any, bool) os.append(4, (types.Boolean, types.Any)) with self.assertRaises(TypeError) as raises: os.find((types.boolean, types.boolean)) self.assertIn("2 ambiguous signatures", str(raises.exception)) # disambiguous os.append(5, (types.boolean, types.boolean)) self.assertEqual(os.find((types.boolean, types.boolean)), 5)