1*99e0aae7SDavid Rees# Copyright 2019 Google LLC 2*99e0aae7SDavid Rees# 3*99e0aae7SDavid Rees# Licensed under the Apache License, Version 2.0 (the "License"); 4*99e0aae7SDavid Rees# you may not use this file except in compliance with the License. 5*99e0aae7SDavid Rees# You may obtain a copy of the License at 6*99e0aae7SDavid Rees# 7*99e0aae7SDavid Rees# https://www.apache.org/licenses/LICENSE-2.0 8*99e0aae7SDavid Rees# 9*99e0aae7SDavid Rees# Unless required by applicable law or agreed to in writing, software 10*99e0aae7SDavid Rees# distributed under the License is distributed on an "AS IS" BASIS, 11*99e0aae7SDavid Rees# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*99e0aae7SDavid Rees# See the License for the specific language governing permissions and 13*99e0aae7SDavid Rees# limitations under the License. 14*99e0aae7SDavid Rees 15*99e0aae7SDavid Rees"""Tests for front_end.test_util.""" 16*99e0aae7SDavid Rees 17*99e0aae7SDavid Reesimport unittest 18*99e0aae7SDavid Rees 19*99e0aae7SDavid Reesfrom compiler.util import ir_data 20*99e0aae7SDavid Reesfrom compiler.util import parser_types 21*99e0aae7SDavid Reesfrom compiler.util import test_util 22*99e0aae7SDavid Rees 23*99e0aae7SDavid Rees 24*99e0aae7SDavid Reesclass ProtoIsSupersetTest(unittest.TestCase): 25*99e0aae7SDavid Rees """Tests for test_util.proto_is_superset.""" 26*99e0aae7SDavid Rees 27*99e0aae7SDavid Rees def test_superset_extra_optional_field(self): 28*99e0aae7SDavid Rees self.assertEqual( 29*99e0aae7SDavid Rees (True, ""), 30*99e0aae7SDavid Rees test_util.proto_is_superset( 31*99e0aae7SDavid Rees ir_data.Structure( 32*99e0aae7SDavid Rees field=[ir_data.Field()], 33*99e0aae7SDavid Rees source_location=parser_types.parse_location("1:2-3:4")), 34*99e0aae7SDavid Rees ir_data.Structure(field=[ir_data.Field()]))) 35*99e0aae7SDavid Rees 36*99e0aae7SDavid Rees def test_superset_extra_repeated_field(self): 37*99e0aae7SDavid Rees self.assertEqual( 38*99e0aae7SDavid Rees (True, ""), 39*99e0aae7SDavid Rees test_util.proto_is_superset( 40*99e0aae7SDavid Rees ir_data.Structure( 41*99e0aae7SDavid Rees field=[ir_data.Field(), ir_data.Field()], 42*99e0aae7SDavid Rees source_location=parser_types.parse_location("1:2-3:4")), 43*99e0aae7SDavid Rees ir_data.Structure(field=[ir_data.Field()]))) 44*99e0aae7SDavid Rees 45*99e0aae7SDavid Rees def test_superset_missing_empty_repeated_field(self): 46*99e0aae7SDavid Rees self.assertEqual( 47*99e0aae7SDavid Rees (False, "field[0] missing"), 48*99e0aae7SDavid Rees test_util.proto_is_superset( 49*99e0aae7SDavid Rees ir_data.Structure( 50*99e0aae7SDavid Rees field=[], 51*99e0aae7SDavid Rees source_location=parser_types.parse_location("1:2-3:4")), 52*99e0aae7SDavid Rees ir_data.Structure(field=[ir_data.Field(), ir_data.Field()]))) 53*99e0aae7SDavid Rees 54*99e0aae7SDavid Rees def test_superset_missing_empty_optional_field(self): 55*99e0aae7SDavid Rees self.assertEqual((False, "source_location missing"), 56*99e0aae7SDavid Rees test_util.proto_is_superset( 57*99e0aae7SDavid Rees ir_data.Structure(field=[]), 58*99e0aae7SDavid Rees ir_data.Structure(source_location=ir_data.Location()))) 59*99e0aae7SDavid Rees 60*99e0aae7SDavid Rees def test_array_element_differs(self): 61*99e0aae7SDavid Rees self.assertEqual( 62*99e0aae7SDavid Rees (False, 63*99e0aae7SDavid Rees "field[0].source_location.start.line differs: found 1, expected 2"), 64*99e0aae7SDavid Rees test_util.proto_is_superset( 65*99e0aae7SDavid Rees ir_data.Structure( 66*99e0aae7SDavid Rees field=[ir_data.Field(source_location=parser_types.parse_location( 67*99e0aae7SDavid Rees "1:2-3:4"))]), 68*99e0aae7SDavid Rees ir_data.Structure( 69*99e0aae7SDavid Rees field=[ir_data.Field(source_location=parser_types.parse_location( 70*99e0aae7SDavid Rees "2:2-3:4"))]))) 71*99e0aae7SDavid Rees 72*99e0aae7SDavid Rees def test_equal(self): 73*99e0aae7SDavid Rees self.assertEqual( 74*99e0aae7SDavid Rees (True, ""), 75*99e0aae7SDavid Rees test_util.proto_is_superset(parser_types.parse_location("1:2-3:4"), 76*99e0aae7SDavid Rees parser_types.parse_location("1:2-3:4"))) 77*99e0aae7SDavid Rees 78*99e0aae7SDavid Rees def test_superset_missing_optional_field(self): 79*99e0aae7SDavid Rees self.assertEqual( 80*99e0aae7SDavid Rees (False, "source_location missing"), 81*99e0aae7SDavid Rees test_util.proto_is_superset( 82*99e0aae7SDavid Rees ir_data.Structure(field=[ir_data.Field()]), 83*99e0aae7SDavid Rees ir_data.Structure( 84*99e0aae7SDavid Rees field=[ir_data.Field()], 85*99e0aae7SDavid Rees source_location=parser_types.parse_location("1:2-3:4")))) 86*99e0aae7SDavid Rees 87*99e0aae7SDavid Rees def test_optional_field_differs(self): 88*99e0aae7SDavid Rees self.assertEqual((False, "end.line differs: found 4, expected 3"), 89*99e0aae7SDavid Rees test_util.proto_is_superset( 90*99e0aae7SDavid Rees parser_types.parse_location("1:2-4:4"), 91*99e0aae7SDavid Rees parser_types.parse_location("1:2-3:4"))) 92*99e0aae7SDavid Rees 93*99e0aae7SDavid Rees def test_non_message_repeated_field_equal(self): 94*99e0aae7SDavid Rees self.assertEqual((True, ""), 95*99e0aae7SDavid Rees test_util.proto_is_superset( 96*99e0aae7SDavid Rees ir_data.CanonicalName(object_path=[]), 97*99e0aae7SDavid Rees ir_data.CanonicalName(object_path=[]))) 98*99e0aae7SDavid Rees 99*99e0aae7SDavid Rees def test_non_message_repeated_field_missing_element(self): 100*99e0aae7SDavid Rees self.assertEqual( 101*99e0aae7SDavid Rees (False, "object_path differs: found {none!r}, expected {a!r}".format( 102*99e0aae7SDavid Rees none=[], 103*99e0aae7SDavid Rees a=[u"a"])), 104*99e0aae7SDavid Rees test_util.proto_is_superset( 105*99e0aae7SDavid Rees ir_data.CanonicalName(object_path=[]), 106*99e0aae7SDavid Rees ir_data.CanonicalName(object_path=[u"a"]))) 107*99e0aae7SDavid Rees 108*99e0aae7SDavid Rees def test_non_message_repeated_field_element_differs(self): 109*99e0aae7SDavid Rees self.assertEqual( 110*99e0aae7SDavid Rees (False, "object_path differs: found {aa!r}, expected {ab!r}".format( 111*99e0aae7SDavid Rees aa=[u"a", u"a"], 112*99e0aae7SDavid Rees ab=[u"a", u"b"])), 113*99e0aae7SDavid Rees test_util.proto_is_superset( 114*99e0aae7SDavid Rees ir_data.CanonicalName(object_path=[u"a", u"a"]), 115*99e0aae7SDavid Rees ir_data.CanonicalName(object_path=[u"a", u"b"]))) 116*99e0aae7SDavid Rees 117*99e0aae7SDavid Rees def test_non_message_repeated_field_extra_element(self): 118*99e0aae7SDavid Rees # For repeated fields of int/bool/str values, the entire list is treated as 119*99e0aae7SDavid Rees # an atomic unit, and should be equal. 120*99e0aae7SDavid Rees self.assertEqual( 121*99e0aae7SDavid Rees (False, 122*99e0aae7SDavid Rees "object_path differs: found {!r}, expected {!r}".format( 123*99e0aae7SDavid Rees [u"a", u"a"], [u"a"])), 124*99e0aae7SDavid Rees test_util.proto_is_superset( 125*99e0aae7SDavid Rees ir_data.CanonicalName(object_path=["a", "a"]), 126*99e0aae7SDavid Rees ir_data.CanonicalName(object_path=["a"]))) 127*99e0aae7SDavid Rees 128*99e0aae7SDavid Rees def test_non_message_repeated_field_no_expected_value(self): 129*99e0aae7SDavid Rees # When a repeated field is empty, it is the same as if it were entirely 130*99e0aae7SDavid Rees # missing -- there is no way to differentiate those two conditions. 131*99e0aae7SDavid Rees self.assertEqual((True, ""), 132*99e0aae7SDavid Rees test_util.proto_is_superset( 133*99e0aae7SDavid Rees ir_data.CanonicalName(object_path=["a", "a"]), 134*99e0aae7SDavid Rees ir_data.CanonicalName(object_path=[]))) 135*99e0aae7SDavid Rees 136*99e0aae7SDavid Rees 137*99e0aae7SDavid Reesclass DictFileReaderTest(unittest.TestCase): 138*99e0aae7SDavid Rees """Tests for dict_file_reader.""" 139*99e0aae7SDavid Rees 140*99e0aae7SDavid Rees def test_empty_dict(self): 141*99e0aae7SDavid Rees reader = test_util.dict_file_reader({}) 142*99e0aae7SDavid Rees self.assertEqual((None, ["File 'anything' not found."]), reader("anything")) 143*99e0aae7SDavid Rees self.assertEqual((None, ["File '' not found."]), reader("")) 144*99e0aae7SDavid Rees 145*99e0aae7SDavid Rees def test_one_element_dict(self): 146*99e0aae7SDavid Rees reader = test_util.dict_file_reader({"m": "abc"}) 147*99e0aae7SDavid Rees self.assertEqual((None, ["File 'not_there' not found."]), 148*99e0aae7SDavid Rees reader("not_there")) 149*99e0aae7SDavid Rees self.assertEqual((None, ["File '' not found."]), reader("")) 150*99e0aae7SDavid Rees self.assertEqual(("abc", None), reader("m")) 151*99e0aae7SDavid Rees 152*99e0aae7SDavid Rees def test_two_element_dict(self): 153*99e0aae7SDavid Rees reader = test_util.dict_file_reader({"m": "abc", "n": "def"}) 154*99e0aae7SDavid Rees self.assertEqual((None, ["File 'not_there' not found."]), 155*99e0aae7SDavid Rees reader("not_there")) 156*99e0aae7SDavid Rees self.assertEqual((None, ["File '' not found."]), reader("")) 157*99e0aae7SDavid Rees self.assertEqual(("abc", None), reader("m")) 158*99e0aae7SDavid Rees self.assertEqual(("def", None), reader("n")) 159*99e0aae7SDavid Rees 160*99e0aae7SDavid Rees def test_dict_with_empty_key(self): 161*99e0aae7SDavid Rees reader = test_util.dict_file_reader({"m": "abc", "": "def"}) 162*99e0aae7SDavid Rees self.assertEqual((None, ["File 'not_there' not found."]), 163*99e0aae7SDavid Rees reader("not_there")) 164*99e0aae7SDavid Rees self.assertEqual((None, ["File 'None' not found."]), reader(None)) 165*99e0aae7SDavid Rees self.assertEqual(("abc", None), reader("m")) 166*99e0aae7SDavid Rees self.assertEqual(("def", None), reader("")) 167*99e0aae7SDavid Rees 168*99e0aae7SDavid Rees 169*99e0aae7SDavid Reesif __name__ == "__main__": 170*99e0aae7SDavid Rees unittest.main() 171