|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "encoding/json" |
| 5 | + "fmt" |
| 6 | + "github.com/liu-cn/json-filter/filter" |
| 7 | + "testing" |
| 8 | +) |
| 9 | + |
| 10 | +type ( |
| 11 | + Tag struct { |
| 12 | + Name string `json:"name,select($any)"` |
| 13 | + Icon string `json:"icon,omit($any)"` |
| 14 | + } |
| 15 | + |
| 16 | + Array struct { |
| 17 | + A [1]Tag `json:"A,select(A|all),omit(A|all)"` |
| 18 | + B [2]Tag `json:"B,select(B|all),omit(B|all)"` |
| 19 | + C [3]Tag `json:"C,select(C|all),omit(C|all)"` |
| 20 | + AP *[1]Tag `json:"AP,select(AP|all),omit(AP|all)"` |
| 21 | + BP *[2]Tag `json:"BP,select(BP|all),omit(BP|all)"` |
| 22 | + CP *[3]Tag `json:"CP,select(CP|all),omit(CP|all)"` |
| 23 | + APP *[1]*Tag `json:"APP,select(APP|all),omit(APP|all)"` |
| 24 | + BPP *[2]*Tag `json:"BPP,select(BPP|all),omit(BPP|all)"` |
| 25 | + CPP *[3]*Tag `json:"CPP,select(CPP|all),omit(CPP|all)"` |
| 26 | + } |
| 27 | +) |
| 28 | + |
| 29 | +var arrayWants = []string{ |
| 30 | + "A", |
| 31 | + "B", |
| 32 | + "C", |
| 33 | + "AP", |
| 34 | + "BP", |
| 35 | + "CP", |
| 36 | + "APP", |
| 37 | + "BPP", |
| 38 | + "CPP", |
| 39 | +} |
| 40 | + |
| 41 | +func getKeys(jsonStr string) string { |
| 42 | + maps := make(map[string]interface{}) |
| 43 | + err := json.Unmarshal([]byte(jsonStr), &maps) |
| 44 | + if err != nil { |
| 45 | + panic(err) |
| 46 | + } |
| 47 | + keys := "" |
| 48 | + for k := range maps { |
| 49 | + keys += k + "," |
| 50 | + } |
| 51 | + return keys |
| 52 | +} |
| 53 | + |
| 54 | +func newArray() *Array { |
| 55 | + |
| 56 | + tag := Tag{Name: "tag"} |
| 57 | + tags1 := [1]Tag{tag} |
| 58 | + tags2 := [2]Tag{tag, tag} |
| 59 | + tags3 := [3]Tag{tag, tag, tag} |
| 60 | + tags1p := &[1]Tag{tag} |
| 61 | + tags2p := &[2]Tag{tag, tag} |
| 62 | + tags3p := &[3]Tag{tag, tag, tag} |
| 63 | + tags1pp := &[1]*Tag{&tag} |
| 64 | + tags2pp := &[2]*Tag{&tag, &tag} |
| 65 | + tags3pp := &[3]*Tag{&tag, &tag, &tag} |
| 66 | + |
| 67 | + arr := &Array{ |
| 68 | + A: tags1, |
| 69 | + B: tags2, |
| 70 | + C: tags3, |
| 71 | + AP: tags1p, |
| 72 | + BP: tags2p, |
| 73 | + CP: tags3p, |
| 74 | + APP: tags1pp, |
| 75 | + BPP: tags2pp, |
| 76 | + CPP: tags3pp, |
| 77 | + } |
| 78 | + return arr |
| 79 | +} |
| 80 | + |
| 81 | +func TestSelectArray(t *testing.T) { |
| 82 | + for _, want := range arrayWants { |
| 83 | + fmt.Println(want, ":", filter.Select(want, newArray())) |
| 84 | + } |
| 85 | + //=== RUN TestSelectArray |
| 86 | + //A : {"A":[{"name":"tag"}]} |
| 87 | + //B : {"B":[{"name":"tag"},{"name":"tag"}]} |
| 88 | + //C : {"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 89 | + //AP : {"AP":[{"name":"tag"}]} |
| 90 | + //BP : {"BP":[{"name":"tag"},{"name":"tag"}]} |
| 91 | + //CP : {"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 92 | + //APP : {"APP":[{"name":"tag"}]} |
| 93 | + //BPP : {"BPP":[{"name":"tag"},{"name":"tag"}]} |
| 94 | + //CPP : {"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 95 | + //--- PASS: TestSelectArray (0.00s) |
| 96 | + //PASS |
| 97 | + |
| 98 | +} |
| 99 | + |
| 100 | +func TestOmitArray(t *testing.T) { |
| 101 | + for _, want := range arrayWants { |
| 102 | + omit := filter.Omit(want, newArray()) |
| 103 | + fmt.Println(want, ":", "keys:", getKeys(mustJson(omit)), omit) |
| 104 | + } |
| 105 | + //=== RUN TestOmitArray |
| 106 | + //A : keys: CP,CPP,AP,APP,B,BP,BPP,C, {"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 107 | + //B : keys: BPP,C,CP,CPP,A,AP,APP,BP, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 108 | + //C : keys: A,AP,APP,B,BP,BPP,CP,CPP, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 109 | + //AP : keys: CPP,A,APP,B,BP,BPP,C,CP, {"A":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 110 | + //BP : keys: APP,B,BPP,C,CP,CPP,A,AP, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 111 | + //CP : keys: CPP,A,AP,APP,B,BP,BPP,C, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 112 | + //APP : keys: BP,BPP,C,CP,CPP,A,AP,B, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 113 | + //BPP : keys: A,AP,APP,B,BP,C,CP,CPP, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 114 | + //CPP : keys: BPP,C,CP,A,AP,APP,B,BP, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]} |
| 115 | + //--- PASS: TestOmitArray (0.00s) |
| 116 | + //PASS |
| 117 | + |
| 118 | +} |
| 119 | + |
| 120 | +func TestEQ(t *testing.T) { |
| 121 | + |
| 122 | + t.Run("select_eq", func(t *testing.T) { |
| 123 | + for _, want := range arrayWants { |
| 124 | + arr := newArray() |
| 125 | + ptr := mustJson(filter.Select(want, arr)) |
| 126 | + val := mustJson(filter.Select(want, *arr)) |
| 127 | + if ptr != val { |
| 128 | + t.Errorf("select传递指针和值结果不相等,want%s,ptr:%s,val:%s", want, ptr, val) |
| 129 | + } |
| 130 | + } |
| 131 | + }) |
| 132 | + t.Run("omit_eq", func(t *testing.T) { |
| 133 | + for _, want := range arrayWants { |
| 134 | + arr := newArray() |
| 135 | + ptr := mustJson(filter.Omit(want, arr)) |
| 136 | + val := mustJson(filter.Omit(want, *arr)) |
| 137 | + if ptr != val { |
| 138 | + t.Errorf("omit传递指针和值结果不相等,want%s,ptr:%s,val:%s", want, ptr, val) |
| 139 | + } |
| 140 | + } |
| 141 | + }) |
| 142 | + //=== RUN TestEQ |
| 143 | + //--- PASS: TestEQ (0.00s) |
| 144 | + //=== RUN TestEQ/select_eq |
| 145 | + //--- PASS: TestEQ/select_eq (0.00s) |
| 146 | + //=== RUN TestEQ/omit_eq |
| 147 | + //--- PASS: TestEQ/omit_eq (0.00s) |
| 148 | + //PASS |
| 149 | + |
| 150 | +} |
0 commit comments