golang.org/x/tools/gopls@v0.15.3/internal/util/bug/bug_test.go (about)

     1  // Copyright 2022 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 bug
     6  
     7  import (
     8  	"encoding/json"
     9  	"fmt"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/google/go-cmp/cmp"
    14  )
    15  
    16  func resetForTesting() {
    17  	exemplars = nil
    18  	handlers = nil
    19  }
    20  
    21  func TestListBugs(t *testing.T) {
    22  	defer resetForTesting()
    23  
    24  	Report("bad")
    25  
    26  	wantBugs(t, "bad")
    27  
    28  	for i := 0; i < 3; i++ {
    29  		Report(fmt.Sprintf("index:%d", i))
    30  	}
    31  
    32  	wantBugs(t, "bad", "index:0")
    33  }
    34  
    35  func wantBugs(t *testing.T, want ...string) {
    36  	t.Helper()
    37  
    38  	bugs := List()
    39  	if got, want := len(bugs), len(want); got != want {
    40  		t.Errorf("List(): got %d bugs, want %d", got, want)
    41  		return
    42  	}
    43  
    44  	for i, b := range bugs {
    45  		if got, want := b.Description, want[i]; got != want {
    46  			t.Errorf("bug.List()[%d] = %q, want %q", i, got, want)
    47  		}
    48  	}
    49  }
    50  
    51  func TestBugHandler(t *testing.T) {
    52  	defer resetForTesting()
    53  
    54  	Report("unseen")
    55  
    56  	// Both handlers are called, in order of registration, only once.
    57  	var got string
    58  	Handle(func(b Bug) { got += "1:" + b.Description })
    59  	Handle(func(b Bug) { got += "2:" + b.Description })
    60  
    61  	Report("seen")
    62  
    63  	Report("again")
    64  
    65  	if want := "1:seen2:seen"; got != want {
    66  		t.Errorf("got %q, want %q", got, want)
    67  	}
    68  }
    69  
    70  func TestBugJSON(t *testing.T) {
    71  	b1 := Bug{
    72  		File:        "foo.go",
    73  		Line:        1,
    74  		Description: "a bug",
    75  		Key:         "foo.go:1",
    76  		Stack:       "<stack>",
    77  		AtTime:      time.Now(),
    78  	}
    79  
    80  	data, err := json.Marshal(b1)
    81  	if err != nil {
    82  		t.Fatal(err)
    83  	}
    84  	var b2 Bug
    85  	if err := json.Unmarshal(data, &b2); err != nil {
    86  		t.Fatal(err)
    87  	}
    88  	if diff := cmp.Diff(b1, b2); diff != "" {
    89  		t.Errorf("bugs differ after JSON Marshal/Unmarshal (-b1 +b2):\n%s", diff)
    90  	}
    91  }