// 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) } } }