| // Copyright 2022 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 benchfmt |
| |
| import ( |
| "testing" |
| |
| "golang.org/x/perf/benchmath" |
| ) |
| |
| func TestReaderUnits(t *testing.T) { |
| _, reader := parseAll(t, ` |
| Unit ns/op a=1 b=2 |
| Unit MB/s c=3 c=3 |
| `) |
| units := reader.Units() |
| if len(units) != 3 { |
| t.Fatalf("expected 3 unit metadata, got %d:\n%v", len(units), units) |
| } |
| check := func(unit, tidyUnit, key, value string) { |
| t.Helper() |
| // The map is indexed by tidy units. |
| mkey := UnitMetadataKey{tidyUnit, key} |
| m, ok := units[mkey] |
| if !ok { |
| t.Errorf("for %s:%s, want %s, got none", tidyUnit, key, value) |
| return |
| } |
| want := UnitMetadata{UnitMetadataKey: mkey, OrigUnit: unit, Value: value} |
| if m.UnitMetadataKey != want.UnitMetadataKey || |
| m.OrigUnit != want.OrigUnit || |
| m.Value != want.Value { |
| t.Errorf("for %s:%s, want %+v, got %+v", unit, key, want, m) |
| } |
| // Check that Get works for both tidied and untidied units. |
| if got := units.Get(unit, key); got != m { |
| t.Errorf("for Get(%v, %v), want %+v, got %+v", unit, key, m, got) |
| } |
| if got := units.Get(tidyUnit, key); got != m { |
| t.Errorf("for Get(%v, %v), want %+v, got %+v", tidyUnit, key, m, got) |
| } |
| } |
| check("ns/op", "sec/op", "a", "1") |
| check("ns/op", "sec/op", "b", "2") |
| check("MB/s", "B/s", "c", "3") |
| } |
| |
| func TestUnitsGetAssumption(t *testing.T) { |
| _, reader := parseAll(t, ` |
| Unit a assume=nothing |
| Unit ns/frob assume=exact |
| Unit c assume=blah`) |
| units := reader.Units() |
| |
| check := func(unit string, want benchmath.Assumption) { |
| got := units.GetAssumption(unit) |
| if got != want { |
| t.Errorf("for unit %s, want assumption %s, got %s", unit, want, got) |
| } |
| } |
| check("a", benchmath.AssumeNothing) |
| check("ns/frob", benchmath.AssumeExact) |
| check("sec/frob", benchmath.AssumeExact) |
| check("c", benchmath.AssumeNothing) |
| } |
| |
| func TestUnitsGetBetter(t *testing.T) { |
| _, reader := parseAll(t, ` |
| Unit a better=higher |
| Unit b better=lower`) |
| units := reader.Units() |
| |
| check := func(unit string, want int) { |
| got := units.GetBetter(unit) |
| if got != want { |
| t.Errorf("for unit %s, want better=%+d, got %+d", unit, want, got) |
| } |
| } |
| check("a", 1) |
| check("b", -1) |
| check("c", 0) |
| |
| check("ns/op", -1) |
| check("sec/op", -1) |
| |
| check("MB/s", 1) |
| check("B/s", 1) |
| |
| check("B/op", -1) |
| check("allocs/op", -1) |
| |
| // Check that we can override the built-ins |
| _, reader = parseAll(t, "Unit ns/op better=higher") |
| units = reader.Units() |
| check("ns/op", 1) |
| check("sec/op", 1) |
| } |