diff --git a/ucl/builtins.go b/ucl/builtins.go index e1edbcc..689e09e 100644 --- a/ucl/builtins.go +++ b/ucl/builtins.go @@ -283,7 +283,7 @@ func notBuiltin(ctx context.Context, args invocationArgs) (Object, error) { return nil, err } - return BoolObject(!args.args[0].Truthy()), nil + return BoolObject(!isTruthy(args.args[0])), nil } var errObjectsNotEqual = errors.New("objects not equal") diff --git a/ucl/builtins_test.go b/ucl/builtins_test.go index 4a099f9..8dea035 100644 --- a/ucl/builtins_test.go +++ b/ucl/builtins_test.go @@ -1766,6 +1766,35 @@ func TestBuiltins_Cat(t *testing.T) { } } +func TestBuiltins_Not(t *testing.T) { + tests := []struct { + desc string + expr string + want any + }{ + {desc: "not 1", expr: `not 1`, want: false}, + {desc: "not 2", expr: `not 0`, want: true}, + {desc: "not 3", expr: `not ()`, want: true}, + {desc: "not 4", expr: `not $true`, want: false}, + {desc: "not 5", expr: `not $false`, want: true}, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + ctx := context.Background() + outW := bytes.NewBuffer(nil) + + inst := New(WithOut(outW), WithTestBuiltin()) + inst.SetVar("true", true) + inst.SetVar("false", false) + + eqRes, err := inst.EvalString(ctx, tt.expr) + assert.NoError(t, err) + assert.Equal(t, tt.want, eqRes) + }) + } +} + func TestBuiltins_NotNil(t *testing.T) { tests := []struct { desc string