golang.org/x/tools@v0.21.1-0.20240520172518-788d39e776b1/internal/jsonrpc2/wire_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 jsonrpc2_test 6 7 import ( 8 "bytes" 9 "encoding/json" 10 "fmt" 11 "testing" 12 13 "golang.org/x/tools/internal/jsonrpc2" 14 ) 15 16 var wireIDTestData = []struct { 17 name string 18 id jsonrpc2.ID 19 encoded []byte 20 plain string 21 quoted string 22 }{ 23 { 24 name: `empty`, 25 encoded: []byte(`0`), 26 plain: `0`, 27 quoted: `#0`, 28 }, { 29 name: `number`, 30 id: jsonrpc2.NewIntID(43), 31 encoded: []byte(`43`), 32 plain: `43`, 33 quoted: `#43`, 34 }, { 35 name: `string`, 36 id: jsonrpc2.NewStringID("life"), 37 encoded: []byte(`"life"`), 38 plain: `life`, 39 quoted: `"life"`, 40 }, 41 } 42 43 func TestIDFormat(t *testing.T) { 44 for _, test := range wireIDTestData { 45 t.Run(test.name, func(t *testing.T) { 46 if got := fmt.Sprint(test.id); got != test.plain { 47 t.Errorf("got %s expected %s", got, test.plain) 48 } 49 if got := fmt.Sprintf("%q", test.id); got != test.quoted { 50 t.Errorf("got %s want %s", got, test.quoted) 51 } 52 }) 53 } 54 } 55 56 func TestIDEncode(t *testing.T) { 57 for _, test := range wireIDTestData { 58 t.Run(test.name, func(t *testing.T) { 59 data, err := json.Marshal(&test.id) 60 if err != nil { 61 t.Fatal(err) 62 } 63 checkJSON(t, data, test.encoded) 64 }) 65 } 66 } 67 68 func TestIDDecode(t *testing.T) { 69 for _, test := range wireIDTestData { 70 t.Run(test.name, func(t *testing.T) { 71 var got *jsonrpc2.ID 72 if err := json.Unmarshal(test.encoded, &got); err != nil { 73 t.Fatal(err) 74 } 75 if got == nil { 76 t.Errorf("got nil want %s", test.id) 77 } else if *got != test.id { 78 t.Errorf("got %s want %s", got, test.id) 79 } 80 }) 81 } 82 } 83 84 func TestErrorEncode(t *testing.T) { 85 b, err := json.Marshal(jsonrpc2.NewError(0, "")) 86 if err != nil { 87 t.Fatal(err) 88 } 89 checkJSON(t, b, []byte(`{ 90 "code": 0, 91 "message": "" 92 }`)) 93 } 94 95 func TestErrorResponse(t *testing.T) { 96 // originally reported in #39719, this checks that result is not present if 97 // it is an error response 98 r, _ := jsonrpc2.NewResponse(jsonrpc2.NewIntID(3), nil, fmt.Errorf("computing fix edits")) 99 data, err := json.Marshal(r) 100 if err != nil { 101 t.Fatal(err) 102 } 103 checkJSON(t, data, []byte(`{ 104 "jsonrpc":"2.0", 105 "error":{ 106 "code":0, 107 "message":"computing fix edits" 108 }, 109 "id":3 110 }`)) 111 } 112 113 func checkJSON(t *testing.T, got, want []byte) { 114 // compare the compact form, to allow for formatting differences 115 g := &bytes.Buffer{} 116 if err := json.Compact(g, []byte(got)); err != nil { 117 t.Fatal(err) 118 } 119 w := &bytes.Buffer{} 120 if err := json.Compact(w, []byte(want)); err != nil { 121 t.Fatal(err) 122 } 123 if g.String() != w.String() { 124 t.Fatalf("Got:\n%s\nWant:\n%s", g, w) 125 } 126 }