1*ba677afaSXin Lipackage common 2*ba677afaSXin Li 3*ba677afaSXin Liimport ( 4*ba677afaSXin Li "encoding/json" 5*ba677afaSXin Li "fmt" 6*ba677afaSXin Li "reflect" 7*ba677afaSXin Li "strings" 8*ba677afaSXin Li "testing" 9*ba677afaSXin Li) 10*ba677afaSXin Li 11*ba677afaSXin Lifunc Test_DocElementIDEncoding(t *testing.T) { 12*ba677afaSXin Li tests := []struct { 13*ba677afaSXin Li name string 14*ba677afaSXin Li value DocElementID 15*ba677afaSXin Li expected string 16*ba677afaSXin Li err bool 17*ba677afaSXin Li }{ 18*ba677afaSXin Li { 19*ba677afaSXin Li name: "ElementRefID", 20*ba677afaSXin Li value: DocElementID{ 21*ba677afaSXin Li ElementRefID: "some-id", 22*ba677afaSXin Li }, 23*ba677afaSXin Li expected: "SPDXRef-some-id", 24*ba677afaSXin Li }, 25*ba677afaSXin Li { 26*ba677afaSXin Li name: "DocumentRefID:ElementRefID", 27*ba677afaSXin Li value: DocElementID{ 28*ba677afaSXin Li DocumentRefID: "a-doc", 29*ba677afaSXin Li ElementRefID: "some-id", 30*ba677afaSXin Li }, 31*ba677afaSXin Li expected: "DocumentRef-a-doc:SPDXRef-some-id", 32*ba677afaSXin Li }, 33*ba677afaSXin Li { 34*ba677afaSXin Li name: "DocumentRefID no ElementRefID", 35*ba677afaSXin Li value: DocElementID{ 36*ba677afaSXin Li DocumentRefID: "a-doc", 37*ba677afaSXin Li }, 38*ba677afaSXin Li err: true, 39*ba677afaSXin Li }, 40*ba677afaSXin Li { 41*ba677afaSXin Li name: "SpecialID", 42*ba677afaSXin Li value: DocElementID{ 43*ba677afaSXin Li SpecialID: "special-id", 44*ba677afaSXin Li }, 45*ba677afaSXin Li expected: "special-id", 46*ba677afaSXin Li }, 47*ba677afaSXin Li } 48*ba677afaSXin Li 49*ba677afaSXin Li for _, test := range tests { 50*ba677afaSXin Li t.Run(test.name, func(t *testing.T) { 51*ba677afaSXin Li result, err := json.Marshal(test.value) 52*ba677afaSXin Li switch { 53*ba677afaSXin Li case !test.err && err != nil: 54*ba677afaSXin Li t.Fatalf("unexpected error: %v", err) 55*ba677afaSXin Li case test.err && err == nil: 56*ba677afaSXin Li t.Fatalf("expected error but got none") 57*ba677afaSXin Li case test.err: 58*ba677afaSXin Li return 59*ba677afaSXin Li } 60*ba677afaSXin Li s := string(result) 61*ba677afaSXin Li if !strings.HasPrefix(s, `"`) || !strings.HasSuffix(s, `"`) { 62*ba677afaSXin Li t.Fatalf("string was not returned: %s", s) 63*ba677afaSXin Li } 64*ba677afaSXin Li s = strings.Trim(s, `"`) 65*ba677afaSXin Li if test.expected != s { 66*ba677afaSXin Li t.Fatalf("%s != %s", test.expected, s) 67*ba677afaSXin Li } 68*ba677afaSXin Li }) 69*ba677afaSXin Li } 70*ba677afaSXin Li} 71*ba677afaSXin Li 72*ba677afaSXin Lifunc Test_DocElementIDDecoding(t *testing.T) { 73*ba677afaSXin Li tests := []struct { 74*ba677afaSXin Li name string 75*ba677afaSXin Li value string 76*ba677afaSXin Li expected DocElementID 77*ba677afaSXin Li err bool 78*ba677afaSXin Li }{ 79*ba677afaSXin Li { 80*ba677afaSXin Li name: "ElementRefID", 81*ba677afaSXin Li value: "SPDXRef-some-id", 82*ba677afaSXin Li expected: DocElementID{ 83*ba677afaSXin Li ElementRefID: "some-id", 84*ba677afaSXin Li }, 85*ba677afaSXin Li }, 86*ba677afaSXin Li { 87*ba677afaSXin Li name: "DocumentRefID:ElementRefID", 88*ba677afaSXin Li value: "DocumentRef-a-doc:SPDXRef-some-id", 89*ba677afaSXin Li expected: DocElementID{ 90*ba677afaSXin Li DocumentRefID: "a-doc", 91*ba677afaSXin Li ElementRefID: "some-id", 92*ba677afaSXin Li }, 93*ba677afaSXin Li }, 94*ba677afaSXin Li { 95*ba677afaSXin Li name: "DocumentRefID no ElementRefID", 96*ba677afaSXin Li value: "DocumentRef-a-doc", 97*ba677afaSXin Li expected: DocElementID{ 98*ba677afaSXin Li DocumentRefID: "a-doc", 99*ba677afaSXin Li }, 100*ba677afaSXin Li }, 101*ba677afaSXin Li { 102*ba677afaSXin Li name: "DocumentRefID invalid ElementRefID", 103*ba677afaSXin Li value: "DocumentRef-a-doc:invalid", 104*ba677afaSXin Li err: true, 105*ba677afaSXin Li }, 106*ba677afaSXin Li { 107*ba677afaSXin Li name: "invalid format", 108*ba677afaSXin Li value: "some-id-without-spdxref", 109*ba677afaSXin Li err: true, 110*ba677afaSXin Li }, 111*ba677afaSXin Li { 112*ba677afaSXin Li name: "SpecialID NONE", 113*ba677afaSXin Li value: "NONE", 114*ba677afaSXin Li expected: DocElementID{ 115*ba677afaSXin Li SpecialID: "NONE", 116*ba677afaSXin Li }, 117*ba677afaSXin Li }, 118*ba677afaSXin Li { 119*ba677afaSXin Li name: "SpecialID NOASSERTION", 120*ba677afaSXin Li value: "NOASSERTION", 121*ba677afaSXin Li expected: DocElementID{ 122*ba677afaSXin Li SpecialID: "NOASSERTION", 123*ba677afaSXin Li }, 124*ba677afaSXin Li }, 125*ba677afaSXin Li } 126*ba677afaSXin Li 127*ba677afaSXin Li for _, test := range tests { 128*ba677afaSXin Li t.Run(test.name, func(t *testing.T) { 129*ba677afaSXin Li out := DocElementID{} 130*ba677afaSXin Li s := fmt.Sprintf(`"%s"`, test.value) 131*ba677afaSXin Li err := json.Unmarshal([]byte(s), &out) 132*ba677afaSXin Li switch { 133*ba677afaSXin Li case !test.err && err != nil: 134*ba677afaSXin Li t.Fatalf("unexpected error: %v", err) 135*ba677afaSXin Li case test.err && err == nil: 136*ba677afaSXin Li t.Fatalf("expected error but got none") 137*ba677afaSXin Li case test.err: 138*ba677afaSXin Li return 139*ba677afaSXin Li } 140*ba677afaSXin Li if !reflect.DeepEqual(test.expected, out) { 141*ba677afaSXin Li t.Fatalf("unexpected value: %v != %v", test.expected, out) 142*ba677afaSXin Li } 143*ba677afaSXin Li }) 144*ba677afaSXin Li } 145*ba677afaSXin Li} 146*ba677afaSXin Li 147*ba677afaSXin Lifunc Test_ElementIDEncoding(t *testing.T) { 148*ba677afaSXin Li tests := []struct { 149*ba677afaSXin Li name string 150*ba677afaSXin Li value ElementID 151*ba677afaSXin Li expected string 152*ba677afaSXin Li err bool 153*ba677afaSXin Li }{ 154*ba677afaSXin Li { 155*ba677afaSXin Li name: "appends spdxref", 156*ba677afaSXin Li value: ElementID("some-id"), 157*ba677afaSXin Li expected: "SPDXRef-some-id", 158*ba677afaSXin Li }, 159*ba677afaSXin Li { 160*ba677afaSXin Li name: "appends spdxref", 161*ba677afaSXin Li value: ElementID("SPDXRef-some-id"), 162*ba677afaSXin Li expected: "SPDXRef-some-id", 163*ba677afaSXin Li }, 164*ba677afaSXin Li } 165*ba677afaSXin Li 166*ba677afaSXin Li for _, test := range tests { 167*ba677afaSXin Li t.Run(test.name, func(t *testing.T) { 168*ba677afaSXin Li result, err := json.Marshal(test.value) 169*ba677afaSXin Li switch { 170*ba677afaSXin Li case !test.err && err != nil: 171*ba677afaSXin Li t.Fatalf("unexpected error: %v", err) 172*ba677afaSXin Li case test.err && err == nil: 173*ba677afaSXin Li t.Fatalf("expected error but got none") 174*ba677afaSXin Li case test.err: 175*ba677afaSXin Li return 176*ba677afaSXin Li } 177*ba677afaSXin Li s := string(result) 178*ba677afaSXin Li if !strings.HasPrefix(s, `"`) || !strings.HasSuffix(s, `"`) { 179*ba677afaSXin Li t.Fatalf("string was not returned: %s", s) 180*ba677afaSXin Li } 181*ba677afaSXin Li s = strings.Trim(s, `"`) 182*ba677afaSXin Li if test.expected != s { 183*ba677afaSXin Li t.Fatalf("%s != %s", test.expected, s) 184*ba677afaSXin Li } 185*ba677afaSXin Li }) 186*ba677afaSXin Li } 187*ba677afaSXin Li} 188*ba677afaSXin Li 189*ba677afaSXin Lifunc Test_ElementIDDecoding(t *testing.T) { 190*ba677afaSXin Li tests := []struct { 191*ba677afaSXin Li name string 192*ba677afaSXin Li value string 193*ba677afaSXin Li expected ElementID 194*ba677afaSXin Li err bool 195*ba677afaSXin Li }{ 196*ba677afaSXin Li { 197*ba677afaSXin Li name: "valid id", 198*ba677afaSXin Li value: "SPDXRef-some-id", 199*ba677afaSXin Li expected: ElementID("some-id"), 200*ba677afaSXin Li }, 201*ba677afaSXin Li { 202*ba677afaSXin Li name: "invalid format", 203*ba677afaSXin Li value: "some-id-without-spdxref", 204*ba677afaSXin Li err: true, 205*ba677afaSXin Li }, 206*ba677afaSXin Li } 207*ba677afaSXin Li 208*ba677afaSXin Li for _, test := range tests { 209*ba677afaSXin Li t.Run(test.name, func(t *testing.T) { 210*ba677afaSXin Li var out ElementID 211*ba677afaSXin Li s := fmt.Sprintf(`"%s"`, test.value) 212*ba677afaSXin Li err := json.Unmarshal([]byte(s), &out) 213*ba677afaSXin Li switch { 214*ba677afaSXin Li case !test.err && err != nil: 215*ba677afaSXin Li t.Fatalf("unexpected error: %v", err) 216*ba677afaSXin Li case test.err && err == nil: 217*ba677afaSXin Li t.Fatalf("expected error but got none") 218*ba677afaSXin Li case test.err: 219*ba677afaSXin Li return 220*ba677afaSXin Li } 221*ba677afaSXin Li if !reflect.DeepEqual(test.expected, out) { 222*ba677afaSXin Li t.Fatalf("unexpected value: %v != %v", test.expected, out) 223*ba677afaSXin Li } 224*ba677afaSXin Li }) 225*ba677afaSXin Li } 226*ba677afaSXin Li} 227*ba677afaSXin Li 228*ba677afaSXin Lifunc Test_ElementIDStructEncoding(t *testing.T) { 229*ba677afaSXin Li type typ struct { 230*ba677afaSXin Li Id ElementID `json:"id"` 231*ba677afaSXin Li } 232*ba677afaSXin Li tests := []struct { 233*ba677afaSXin Li name string 234*ba677afaSXin Li value typ 235*ba677afaSXin Li expected string 236*ba677afaSXin Li err bool 237*ba677afaSXin Li }{ 238*ba677afaSXin Li { 239*ba677afaSXin Li name: "appends spdxref", 240*ba677afaSXin Li value: typ{ 241*ba677afaSXin Li Id: ElementID("some-id"), 242*ba677afaSXin Li }, 243*ba677afaSXin Li expected: `{"id":"SPDXRef-some-id"}`, 244*ba677afaSXin Li }, 245*ba677afaSXin Li { 246*ba677afaSXin Li name: "appends spdxref", 247*ba677afaSXin Li value: typ{ 248*ba677afaSXin Li Id: ElementID("SPDXRef-some-id"), 249*ba677afaSXin Li }, 250*ba677afaSXin Li expected: `{"id":"SPDXRef-some-id"}`, 251*ba677afaSXin Li }, 252*ba677afaSXin Li } 253*ba677afaSXin Li 254*ba677afaSXin Li for _, test := range tests { 255*ba677afaSXin Li t.Run(test.name, func(t *testing.T) { 256*ba677afaSXin Li result, err := json.Marshal(test.value) 257*ba677afaSXin Li switch { 258*ba677afaSXin Li case !test.err && err != nil: 259*ba677afaSXin Li t.Fatalf("unexpected error: %v", err) 260*ba677afaSXin Li case test.err && err == nil: 261*ba677afaSXin Li t.Fatalf("expected error but got none") 262*ba677afaSXin Li case test.err: 263*ba677afaSXin Li return 264*ba677afaSXin Li } 265*ba677afaSXin Li s := string(result) 266*ba677afaSXin Li if test.expected != s { 267*ba677afaSXin Li t.Fatalf("%s != %s", test.expected, s) 268*ba677afaSXin Li } 269*ba677afaSXin Li }) 270*ba677afaSXin Li } 271*ba677afaSXin Li} 272*ba677afaSXin Li 273*ba677afaSXin Lifunc Test_ElementIDStructDecoding(t *testing.T) { 274*ba677afaSXin Li type typ struct { 275*ba677afaSXin Li Id ElementID `json:"id"` 276*ba677afaSXin Li } 277*ba677afaSXin Li tests := []struct { 278*ba677afaSXin Li name string 279*ba677afaSXin Li value string 280*ba677afaSXin Li expected typ 281*ba677afaSXin Li err bool 282*ba677afaSXin Li }{ 283*ba677afaSXin Li { 284*ba677afaSXin Li name: "valid id", 285*ba677afaSXin Li expected: typ{ 286*ba677afaSXin Li Id: ElementID("some-id"), 287*ba677afaSXin Li }, 288*ba677afaSXin Li value: `{"id":"SPDXRef-some-id"}`, 289*ba677afaSXin Li }, 290*ba677afaSXin Li { 291*ba677afaSXin Li name: "invalid format", 292*ba677afaSXin Li value: `{"id":"some-id"}`, 293*ba677afaSXin Li err: true, 294*ba677afaSXin Li }, 295*ba677afaSXin Li } 296*ba677afaSXin Li 297*ba677afaSXin Li for _, test := range tests { 298*ba677afaSXin Li t.Run(test.name, func(t *testing.T) { 299*ba677afaSXin Li out := typ{} 300*ba677afaSXin Li err := json.Unmarshal([]byte(test.value), &out) 301*ba677afaSXin Li switch { 302*ba677afaSXin Li case !test.err && err != nil: 303*ba677afaSXin Li t.Fatalf("unexpected error: %v", err) 304*ba677afaSXin Li case test.err && err == nil: 305*ba677afaSXin Li t.Fatalf("expected error but got none") 306*ba677afaSXin Li case test.err: 307*ba677afaSXin Li return 308*ba677afaSXin Li } 309*ba677afaSXin Li if !reflect.DeepEqual(test.expected, out) { 310*ba677afaSXin Li t.Fatalf("unexpected value: %v != %v", test.expected, out) 311*ba677afaSXin Li } 312*ba677afaSXin Li }) 313*ba677afaSXin Li } 314*ba677afaSXin Li} 315