| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package chartconfig_test |
| |
| import ( |
| "reflect" |
| "testing" |
| |
| "golang.org/x/telemetry/internal/chartconfig" |
| ) |
| |
| func TestLoad(t *testing.T) { |
| // Test that we can actually load the chart config. |
| if _, err := chartconfig.Load(); err != nil { |
| t.Errorf("Load() failed: %v", err) |
| } |
| } |
| |
| func TestParse(t *testing.T) { |
| tests := []struct { |
| name string |
| input string |
| want []chartconfig.ChartConfig |
| }{ |
| {"empty", "", nil}, |
| {"single field", "title: A", []chartconfig.ChartConfig{{Title: "A"}}}, |
| { |
| "basic", ` |
| title: A |
| description: B |
| type: C |
| program: D |
| counter: E |
| issue: F1 |
| issue: F2 |
| depth: 2 |
| error: 0.1 |
| version: v2.0.0 |
| `, |
| []chartconfig.ChartConfig{{ |
| Title: "A", |
| Description: "B", |
| Type: "C", |
| Program: "D", |
| Counter: "E", |
| Issue: []string{"F1", "F2"}, |
| Depth: 2, |
| Error: 0.1, |
| Version: "v2.0.0", |
| }}, |
| }, |
| { |
| "partial", ` |
| title: A |
| description: B |
| `, |
| []chartconfig.ChartConfig{ |
| {Title: "A", Description: "B"}, |
| }, |
| }, |
| { |
| "comments and whitespace", ` |
| # A comment |
| title: A # a line comment |
| |
| # Another comment |
| |
| description: B |
| |
| |
| `, |
| []chartconfig.ChartConfig{ |
| {Title: "A", Description: "B"}, |
| }, |
| }, |
| { |
| "multi-record", ` |
| # Empty records are skipped |
| --- |
| title: A |
| description: B |
| |
| --- |
| |
| title: C |
| description: D |
| `, |
| []chartconfig.ChartConfig{ |
| {Title: "A", Description: "B"}, |
| {Title: "C", Description: "D"}, |
| }, |
| }, |
| { |
| "example", ` |
| title: Editor Distribution |
| counter: gopls/editor:{emacs,vim,vscode,other} |
| description: measure editor distribution for gopls users. |
| type: partition |
| issue: TBD |
| program: golang.org/x/tools/gopls |
| `, |
| []chartconfig.ChartConfig{ |
| { |
| Title: "Editor Distribution", |
| Description: "measure editor distribution for gopls users.", |
| Counter: "gopls/editor:{emacs,vim,vscode,other}", |
| Type: "partition", |
| Issue: []string{"TBD"}, |
| Program: "golang.org/x/tools/gopls", |
| }, |
| }, |
| }, |
| { |
| "multiline counter field", ` |
| counter: foo:{ |
| bar, |
| baz |
| } |
| `, |
| []chartconfig.ChartConfig{ |
| {Counter: "foo:{bar,baz}"}, |
| }, |
| }, |
| { |
| "multiline counter field with braces immediately next to text", ` |
| counter: foo:{bar, |
| baz} |
| `, |
| []chartconfig.ChartConfig{ |
| {Counter: "foo:{bar,baz}"}, |
| }, |
| }, |
| } |
| |
| for _, test := range tests { |
| t.Run(test.name, func(t *testing.T) { |
| got, err := chartconfig.Parse([]byte(test.input)) |
| if err != nil { |
| t.Fatalf("Parse(...) failed: %v", err) |
| } |
| if len(got) != len(test.want) { |
| t.Fatalf("Parse(...) returned %d records, want %d", len(got), len(test.want)) |
| } |
| for i, got := range got { |
| want := test.want[i] |
| if !reflect.DeepEqual(got, want) { |
| t.Errorf("Parse(...): record %d = %#v, want %#v", i, got, want) |
| } |
| } |
| }) |
| } |
| } |
| |
| func TestParseErrors(t *testing.T) { |
| tests := []struct { |
| name string |
| input string |
| }{ |
| { |
| "leading space", |
| ` |
| title: foo |
| `, |
| }, |
| { |
| "unknown key", |
| ` |
| foo: bar |
| `, |
| }, |
| { |
| "bad separator", |
| ` |
| title: foo |
| --- # comments aren't allowed after separators |
| title: bar |
| `, |
| }, |
| { |
| "invalid depth", |
| ` |
| depth: notanint |
| `, |
| }, |
| { |
| "open curly brace not in counter field", |
| ` |
| title: { |
| `, |
| }, |
| { |
| "close curly brace not in counter field", |
| ` |
| title: } |
| `, |
| }, |
| { |
| "end of record within multiline counter field", |
| ` |
| counter: foo{ |
| bar |
| --- |
| title: baz |
| `, |
| }, |
| { |
| "end of file within multiline counter field", |
| ` |
| counter: foo{ |
| bar |
| `, |
| }, |
| { |
| "close curly before open curly", |
| ` |
| counter: }foo{ |
| bar |
| }`, |
| }, |
| { |
| "open curly after close curly", |
| ` |
| counter: foo{ |
| bar |
| } {`, |
| }, |
| { |
| "open curly after open curly same line", |
| ` |
| counter: foo{{ |
| bar |
| }`, |
| }, |
| { |
| "open curly after open curly different line", |
| ` |
| counter: foo{ |
| {bar |
| }`, |
| }, |
| { |
| "close curly after close curly", |
| ` |
| counter: foo{ |
| bar |
| } }`, |
| }, |
| { |
| "comma right before close curly", |
| ` |
| counter: foo{ |
| bar, |
| baz, |
| } }`, |
| }, |
| } |
| |
| for _, test := range tests { |
| t.Run(test.name, func(t *testing.T) { |
| _, err := chartconfig.Parse([]byte(test.input)) |
| if err == nil { |
| t.Fatalf("Parse(...) succeeded unexpectedly") |
| } |
| }) |
| } |
| } |