| // Copyright 2021 The Tint Authors. | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //     http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | package substr | 
 |  | 
 | import ( | 
 | 	"strings" | 
 | 	"testing" | 
 | ) | 
 |  | 
 | func TestFixSubstr(t *testing.T) { | 
 | 	type test struct { | 
 | 		body   string | 
 | 		substr string | 
 | 		expect string | 
 | 	} | 
 |  | 
 | 	for _, test := range []test{ | 
 | 		{ | 
 | 			body:   "abc_def_ghi_jkl_mno", | 
 | 			substr: "def_XXX_jkl", | 
 | 			expect: "def_ghi_jkl", | 
 | 		}, | 
 | 		{ | 
 | 			body:   "abc\ndef\nghi\njkl\nmno", | 
 | 			substr: "def\nXXX\njkl", | 
 | 			expect: "def\nghi\njkl", | 
 | 		}, | 
 | 		{ | 
 | 			body:   "aaaaa12345ccccc", | 
 | 			substr: "1x345", | 
 | 			expect: "12345", | 
 | 		}, | 
 | 		{ | 
 | 			body:   "aaaaa12345ccccc", | 
 | 			substr: "12x45", | 
 | 			expect: "12345", | 
 | 		}, | 
 | 		{ | 
 | 			body:   "aaaaa12345ccccc", | 
 | 			substr: "123x5", | 
 | 			expect: "12345", | 
 | 		}, | 
 | 		{ | 
 | 			body:   "aaaaaaaaaaaaa", | 
 | 			substr: "bbbbbbbbbbbbb", | 
 | 			expect: "", // cannot produce a sensible diff | 
 | 		}, { /////////////////////////////////////////////////////////////////// | 
 | 			body: `Return{ | 
 |   { | 
 |     ScalarConstructor[not set]{42u} | 
 |   } | 
 | } | 
 | `, | 
 | 			substr: `Return{ | 
 |   { | 
 |     ScalarConstructor[not set]{42} | 
 |   } | 
 | }`, | 
 | 			expect: `Return{ | 
 |   { | 
 |     ScalarConstructor[not set]{42u} | 
 |   } | 
 | }`, | 
 | 		}, { /////////////////////////////////////////////////////////////////// | 
 | 			body: `VariableDeclStatement{ | 
 |   Variable{ | 
 |     x_1 | 
 |     function | 
 |     __u32 | 
 |   } | 
 | } | 
 | Assignment{ | 
 |   Identifier[not set]{x_1} | 
 |   ScalarConstructor[not set]{42u} | 
 | } | 
 | Assignment{ | 
 |   Identifier[not set]{x_1} | 
 |   ScalarConstructor[not set]{0u} | 
 | } | 
 | Return{} | 
 | `, | 
 | 			substr: `Assignment{ | 
 |   Identifier[not set]{x_1} | 
 |   ScalarConstructor[not set]{42} | 
 | } | 
 | Assignment{ | 
 |   Identifier[not set]{x_1} | 
 |   ScalarConstructor[not set]{0} | 
 | }`, | 
 | 			expect: `Assignment{ | 
 |   Identifier[not set]{x_1} | 
 |   ScalarConstructor[not set]{42u} | 
 | } | 
 | Assignment{ | 
 |   Identifier[not set]{x_1} | 
 |   ScalarConstructor[not set]{0u} | 
 | }`, | 
 | 		}, { /////////////////////////////////////////////////////////////////// | 
 | 			body: `VariableDeclStatement{ | 
 |   Variable{ | 
 |     a | 
 |     function | 
 |     __bool | 
 |     { | 
 |       ScalarConstructor[not set]{true} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     b | 
 |     function | 
 |     __bool | 
 |     { | 
 |       ScalarConstructor[not set]{false} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     c | 
 |     function | 
 |     __i32 | 
 |     { | 
 |       ScalarConstructor[not set]{-1} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     d | 
 |     function | 
 |     __u32 | 
 |     { | 
 |       ScalarConstructor[not set]{1u} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     e | 
 |     function | 
 |     __f32 | 
 |     { | 
 |       ScalarConstructor[not set]{1.500000} | 
 |     } | 
 |   } | 
 | } | 
 | `, | 
 | 			substr: `VariableDeclStatement{ | 
 |   Variable{ | 
 |     a | 
 |     function | 
 |     __bool | 
 |     { | 
 |       ScalarConstructor[not set]{true} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     b | 
 |     function | 
 |     __bool | 
 |     { | 
 |       ScalarConstructor[not set]{false} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     c | 
 |     function | 
 |     __i32 | 
 |     { | 
 |       ScalarConstructor[not set]{-1} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     d | 
 |     function | 
 |     __u32 | 
 |     { | 
 |       ScalarConstructor[not set]{1} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     e | 
 |     function | 
 |     __f32 | 
 |     { | 
 |       ScalarConstructor[not set]{1.500000} | 
 |     } | 
 |   } | 
 | } | 
 | `, | 
 | 			expect: `VariableDeclStatement{ | 
 |   Variable{ | 
 |     a | 
 |     function | 
 |     __bool | 
 |     { | 
 |       ScalarConstructor[not set]{true} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     b | 
 |     function | 
 |     __bool | 
 |     { | 
 |       ScalarConstructor[not set]{false} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     c | 
 |     function | 
 |     __i32 | 
 |     { | 
 |       ScalarConstructor[not set]{-1} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     d | 
 |     function | 
 |     __u32 | 
 |     { | 
 |       ScalarConstructor[not set]{1u} | 
 |     } | 
 |   } | 
 | } | 
 | VariableDeclStatement{ | 
 |   Variable{ | 
 |     e | 
 |     function | 
 |     __f32 | 
 |     { | 
 |       ScalarConstructor[not set]{1.500000} | 
 |     } | 
 |   } | 
 | } | 
 | `, | 
 | 		}, | 
 | 	} { | 
 | 		body := strings.ReplaceAll(test.body, "\n", "") | 
 | 		substr := strings.ReplaceAll(test.substr, "\n", "") | 
 | 		expect := strings.ReplaceAll(test.expect, "\n", ``) | 
 | 		got := strings.ReplaceAll(Fix(test.body, test.substr), "\n", "") | 
 | 		if got != expect { | 
 | 			t.Errorf("Test failure:\nbody:   '%v'\nsubstr: '%v'\nexpect: '%v'\ngot:    '%v'\n\n", body, substr, expect, got) | 
 | 		} | 
 |  | 
 | 	} | 
 | } |