You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
3.2 KiB
75 lines
3.2 KiB
// 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) |
|
} |
|
} |
|
} |
|
}
|
|
|