k8s.io/kube-openapi@v0.0.0-20240228011516-70dd3763d340/pkg/internal/third_party/go-json-experiment/json/fold_test.go (about) 1 // Copyright 2020 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package json 6 7 import ( 8 "fmt" 9 "reflect" 10 "testing" 11 "unicode" 12 13 jsonv1 "encoding/json" 14 ) 15 16 var equalFoldTestdata = []struct { 17 in1, in2 string 18 want bool 19 }{ 20 {"", "", true}, 21 {"abc", "abc", true}, 22 {"ABcd", "ABcd", true}, 23 {"123abc", "123ABC", true}, 24 {"_1_2_-_3__--a-_-b-c-", "123ABC", true}, 25 {"αβδ", "ΑΒΔ", true}, 26 {"abc", "xyz", false}, 27 {"abc", "XYZ", false}, 28 {"abcdefghijk", "abcdefghijX", false}, 29 {"abcdefghijk", "abcdefghij\u212A", true}, 30 {"abcdefghijK", "abcdefghij\u212A", true}, 31 {"abcdefghijkz", "abcdefghij\u212Ay", false}, 32 {"abcdefghijKz", "abcdefghij\u212Ay", false}, 33 {"1", "2", false}, 34 {"utf-8", "US-ASCII", false}, 35 {"hello, world!", "hello, world!", true}, 36 {"hello, world!", "Hello, World!", true}, 37 {"hello, world!", "HELLO, WORLD!", true}, 38 {"hello, world!", "jello, world!", false}, 39 {"γειά, κόσμε!", "γειά, κόσμε!", true}, 40 {"γειά, κόσμε!", "Γειά, Κόσμε!", true}, 41 {"γειά, κόσμε!", "ΓΕΙΆ, ΚΌΣΜΕ!", true}, 42 {"γειά, κόσμε!", "ΛΕΙΆ, ΚΌΣΜΕ!", false}, 43 {"AESKey", "aesKey", true}, 44 {"γειά, κόσμε!", "Γ\xce_\xb5ιά, Κόσμε!", false}, 45 {"aeskey", "AESKEY", true}, 46 {"AESKEY", "aes_key", true}, 47 {"aes_key", "AES_KEY", true}, 48 {"AES_KEY", "aes-key", true}, 49 {"aes-key", "AES-KEY", true}, 50 {"AES-KEY", "aesKey", true}, 51 {"aesKey", "AesKey", true}, 52 {"AesKey", "AESKey", true}, 53 {"AESKey", "aeskey", true}, 54 {"DESKey", "aeskey", false}, 55 {"AES Key", "aeskey", false}, 56 {"aes﹏key", "aeskey", false}, // Unicode underscore not handled 57 {"aes〰key", "aeskey", false}, // Unicode dash not handled 58 } 59 60 func TestEqualFold(t *testing.T) { 61 for _, tt := range equalFoldTestdata { 62 got := equalFold([]byte(tt.in1), []byte(tt.in2)) 63 if got != tt.want { 64 t.Errorf("equalFold(%q, %q) = %v, want %v", tt.in1, tt.in2, got, tt.want) 65 } 66 } 67 } 68 69 func equalFold(x, y []byte) bool { 70 return string(foldName(x)) == string(foldName(y)) 71 } 72 73 func TestFoldRune(t *testing.T) { 74 if testing.Short() { 75 t.Skip() 76 } 77 78 var foldSet []rune 79 for r := rune(0); r <= unicode.MaxRune; r++ { 80 // Derive all runes that are all part of the same fold set. 81 foldSet = foldSet[:0] 82 for r0 := r; r != r0 || len(foldSet) == 0; r = unicode.SimpleFold(r) { 83 foldSet = append(foldSet, r) 84 } 85 86 // Normalized form of each rune in a foldset must be the same and 87 // also be within the set itself. 88 var withinSet bool 89 rr0 := foldRune(foldSet[0]) 90 for _, r := range foldSet { 91 withinSet = withinSet || rr0 == r 92 rr := foldRune(r) 93 if rr0 != rr { 94 t.Errorf("foldRune(%q) = %q, want %q", r, rr, rr0) 95 } 96 } 97 if !withinSet { 98 t.Errorf("foldRune(%q) = %q not in fold set %q", foldSet[0], rr0, string(foldSet)) 99 } 100 } 101 } 102 103 // TestBenchmarkUnmarshalUnknown unmarshals an unknown field into a struct with 104 // varying number of fields. Since the unknown field does not directly match 105 // any known field by name, it must fall back on case-insensitive matching. 106 func TestBenchmarkUnmarshalUnknown(t *testing.T) { runUnmarshalUnknown(t) } 107 func BenchmarkUnmarshalUnknown(b *testing.B) { runUnmarshalUnknown(b) } 108 109 func runUnmarshalUnknown(tb testing.TB) { 110 in := []byte(`{"NameUnknown":null}`) 111 for _, n := range []int{1, 2, 5, 10, 20, 50, 100} { 112 unmarshal := Unmarshal 113 if benchV1 { 114 unmarshal = jsonv1.Unmarshal 115 } 116 117 var fields []reflect.StructField 118 for i := 0; i < n; i++ { 119 fields = append(fields, reflect.StructField{ 120 Name: fmt.Sprintf("Name%d", i), 121 Type: reflect.TypeOf(0), 122 Tag: `json:",nocase"`, 123 }) 124 } 125 out := reflect.New(reflect.StructOf(fields)).Interface() 126 127 runTestOrBench(tb, fmt.Sprintf("N%d", n), int64(len(in)), func(tb testing.TB) { 128 if err := unmarshal(in, out); err != nil { 129 tb.Fatalf("Unmarshal error: %v", err) 130 } 131 }) 132 } 133 }