// 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. //go:build goexperiment.jsonv2 package jsonflags import "testing" func TestFlags(t *testing.T) { type Check struct{ want Flags } type Join struct{ in Flags } type Set struct{ in Bools } type Clear struct{ in Bools } type Get struct { in Bools want bool wantOk bool } calls := []any{ Get{in: AllowDuplicateNames, want: false, wantOk: false}, Set{in: AllowDuplicateNames | 0}, Get{in: AllowDuplicateNames, want: false, wantOk: true}, Set{in: AllowDuplicateNames | 1}, Get{in: AllowDuplicateNames, want: true, wantOk: true}, Check{want: Flags{Presence: uint64(AllowDuplicateNames), Values: uint64(AllowDuplicateNames)}}, Get{in: AllowInvalidUTF8, want: false, wantOk: false}, Set{in: AllowInvalidUTF8 | 1}, Get{in: AllowInvalidUTF8, want: true, wantOk: true}, Set{in: AllowInvalidUTF8 | 0}, Get{in: AllowInvalidUTF8, want: false, wantOk: true}, Get{in: AllowDuplicateNames, want: true, wantOk: true}, Check{want: Flags{Presence: uint64(AllowDuplicateNames | AllowInvalidUTF8), Values: uint64(AllowDuplicateNames)}}, Set{in: AllowDuplicateNames | AllowInvalidUTF8 | 0}, Check{want: Flags{Presence: uint64(AllowDuplicateNames | AllowInvalidUTF8), Values: uint64(0)}}, Set{in: AllowDuplicateNames | AllowInvalidUTF8 | 0}, Check{want: Flags{Presence: uint64(AllowDuplicateNames | AllowInvalidUTF8), Values: uint64(0)}}, Set{in: AllowDuplicateNames | AllowInvalidUTF8 | 1}, Check{want: Flags{Presence: uint64(AllowDuplicateNames | AllowInvalidUTF8), Values: uint64(AllowDuplicateNames | AllowInvalidUTF8)}}, Join{in: Flags{Presence: 0, Values: 0}}, Check{want: Flags{Presence: uint64(AllowDuplicateNames | AllowInvalidUTF8), Values: uint64(AllowDuplicateNames | AllowInvalidUTF8)}}, Join{in: Flags{Presence: uint64(Multiline | AllowInvalidUTF8), Values: uint64(AllowDuplicateNames)}}, Check{want: Flags{Presence: uint64(Multiline | AllowDuplicateNames | AllowInvalidUTF8), Values: uint64(AllowDuplicateNames)}}, Clear{in: AllowDuplicateNames | AllowInvalidUTF8}, Check{want: Flags{Presence: uint64(Multiline), Values: uint64(0)}}, Set{in: AllowInvalidUTF8 | Deterministic | ReportErrorsWithLegacySemantics | 1}, Set{in: Multiline | StringifyNumbers | 0}, Check{want: Flags{Presence: uint64(AllowInvalidUTF8 | Deterministic | ReportErrorsWithLegacySemantics | Multiline | StringifyNumbers), Values: uint64(AllowInvalidUTF8 | Deterministic | ReportErrorsWithLegacySemantics)}}, Clear{in: ^AllCoderFlags}, Check{want: Flags{Presence: uint64(AllowInvalidUTF8 | Multiline), Values: uint64(AllowInvalidUTF8)}}, } var fs Flags for i, call := range calls { switch call := call.(type) { case Join: fs.Join(call.in) case Set: fs.Set(call.in) case Clear: fs.Clear(call.in) case Get: got := fs.Get(call.in) gotOk := fs.Has(call.in) if got != call.want || gotOk != call.wantOk { t.Fatalf("%d: GetOk = (%v, %v), want (%v, %v)", i, got, gotOk, call.want, call.wantOk) } case Check: if fs != call.want { t.Fatalf("%d: got %x, want %x", i, fs, call.want) } } } }