From 8de19ba00fbf46b8c8b4735d38fe438f67f5b6f5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 30 Jan 2026 15:03:02 +0000 Subject: [PATCH 1/3] Initial plan From 745e60a075630b5ac2dcb26dea1253b4910d002d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 30 Jan 2026 15:09:59 +0000 Subject: [PATCH 2/3] Fix Abs() function for unsigned integers Co-authored-by: antonmedv <141232+antonmedv@users.noreply.github.com> --- builtin/builtin_test.go | 30 ++++++++++++++++++++++++++++++ builtin/lib.go | 30 +++++------------------------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index b7ad16fd..bdea3b74 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -875,3 +875,33 @@ func TestBuiltin_recursion_custom_max_depth(t *testing.T) { require.NoError(t, err) }) } + +func TestAbs_UnsignedIntegers(t *testing.T) { + // Test that abs() correctly handles unsigned integers + // Unsigned integers are always non-negative, so abs() should return them unchanged + tests := []struct { + name string + env map[string]any + expr string + want any + }{ + {"uint", map[string]any{"x": uint(42)}, "abs(x)", uint(42)}, + {"uint8", map[string]any{"x": uint8(42)}, "abs(x)", uint8(42)}, + {"uint16", map[string]any{"x": uint16(42)}, "abs(x)", uint16(42)}, + {"uint32", map[string]any{"x": uint32(42)}, "abs(x)", uint32(42)}, + {"uint64", map[string]any{"x": uint64(42)}, "abs(x)", uint64(42)}, + {"uint zero", map[string]any{"x": uint(0)}, "abs(x)", uint(0)}, + {"uint8 zero", map[string]any{"x": uint8(0)}, "abs(x)", uint8(0)}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + program, err := expr.Compile(tt.expr, expr.Env(tt.env)) + require.NoError(t, err) + + result, err := expr.Run(program, tt.env) + require.NoError(t, err) + assert.Equal(t, tt.want, result) + }) + } +} diff --git a/builtin/lib.go b/builtin/lib.go index 622612cb..d626f944 100644 --- a/builtin/lib.go +++ b/builtin/lib.go @@ -102,35 +102,15 @@ func Abs(x any) any { return x } case uint: - if x < 0 { - return -x - } else { - return x - } + return x case uint8: - if x < 0 { - return -x - } else { - return x - } + return x case uint16: - if x < 0 { - return -x - } else { - return x - } + return x case uint32: - if x < 0 { - return -x - } else { - return x - } + return x case uint64: - if x < 0 { - return -x - } else { - return x - } + return x } panic(fmt.Sprintf("invalid argument for abs (type %T)", x)) } From 1cec25d0efe4a1f45f14441d64d9ce84efd5ec2d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 30 Jan 2026 15:14:38 +0000 Subject: [PATCH 3/3] Add comprehensive test coverage for unsigned integers in Abs() Co-authored-by: antonmedv <141232+antonmedv@users.noreply.github.com> --- builtin/builtin_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index bdea3b74..caa596c0 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -892,6 +892,9 @@ func TestAbs_UnsignedIntegers(t *testing.T) { {"uint64", map[string]any{"x": uint64(42)}, "abs(x)", uint64(42)}, {"uint zero", map[string]any{"x": uint(0)}, "abs(x)", uint(0)}, {"uint8 zero", map[string]any{"x": uint8(0)}, "abs(x)", uint8(0)}, + {"uint16 zero", map[string]any{"x": uint16(0)}, "abs(x)", uint16(0)}, + {"uint32 zero", map[string]any{"x": uint32(0)}, "abs(x)", uint32(0)}, + {"uint64 zero", map[string]any{"x": uint64(0)}, "abs(x)", uint64(0)}, } for _, tt := range tests {