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  }