From fe9a594343bf61bdd33f3698aa470fb48eaf1916 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 21:35:44 +0000 Subject: [PATCH] fix(campaign): handle NaN and Inf in parseNumber edge case detector Co-authored-by: theRebelliousNerd <187437903+theRebelliousNerd@users.noreply.github.com> --- internal/campaign/edge_case_detector.go | 4 ++++ .../campaign/edge_case_detector_gaps_test.go | 8 +++---- internal/campaign/edge_case_detector_test.go | 23 +++++++++++++++---- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/internal/campaign/edge_case_detector.go b/internal/campaign/edge_case_detector.go index 6a84513f..4852fe7e 100644 --- a/internal/campaign/edge_case_detector.go +++ b/internal/campaign/edge_case_detector.go @@ -10,6 +10,7 @@ import ( "sort" "strings" "time" + "math" "codenerd/internal/core" "codenerd/internal/logging" @@ -585,6 +586,9 @@ func (d *EdgeCaseDetector) parseNumber(arg interface{}) (float64, bool) { case float32: return float64(v), true case float64: + if math.IsNaN(v) || math.IsInf(v, 0) { + return 0, false + } return v, true default: return 0, false diff --git a/internal/campaign/edge_case_detector_gaps_test.go b/internal/campaign/edge_case_detector_gaps_test.go index a9cd9be9..686ec14b 100644 --- a/internal/campaign/edge_case_detector_gaps_test.go +++ b/internal/campaign/edge_case_detector_gaps_test.go @@ -78,14 +78,14 @@ func TestEdgeCaseDetectorGap_TypeCoercion(t *testing.T) { detector := NewEdgeCaseDetector(nil, nil) // Test NaN - nanVal, ok := detector.parseNumber(math.NaN()) - if !ok || !math.IsNaN(nanVal) { + _, ok := detector.parseNumber(math.NaN()) + if ok { t.Errorf("parseNumber failed to handle NaN") } // Test Inf - infVal, ok := detector.parseNumber(math.Inf(1)) - if !ok || !math.IsInf(infVal, 1) { + _, ok = detector.parseNumber(math.Inf(1)) + if ok { t.Errorf("parseNumber failed to handle Inf") } diff --git a/internal/campaign/edge_case_detector_test.go b/internal/campaign/edge_case_detector_test.go index 30bceb09..f063475a 100644 --- a/internal/campaign/edge_case_detector_test.go +++ b/internal/campaign/edge_case_detector_test.go @@ -2,6 +2,7 @@ package campaign import ( "context" + "math" "strings" "testing" "time" @@ -307,10 +308,24 @@ func TestEdgeCaseAnalysis_FileCategories(t *testing.T) { // Test with `IntelligenceReport{FileTopology: map[string]FileInfo{}, GitChurnHotspots: []GitChurn{}}`. // Expected behavior: Should default to ActionCreate gracefully. -// TODO: Missing Edge Case - Type Coercion: parseNumber handling NaN and +Inf. -// Test passing a float64 representing math.NaN() or math.Inf(1) to parseNumber. -// Expected behavior: If Mangle returns an anomalous float, complexity should not become infinite -// or cause ActionRefactorFirst permanently. +func TestEdgeCaseDetector_ParseNumber_AnomalousFloat(t *testing.T) { + d := NewEdgeCaseDetector(nil, nil) + + // Test NaN + if _, ok := d.parseNumber(math.NaN()); ok { + t.Error("parseNumber should return false for NaN") + } + + // Test +Inf + if _, ok := d.parseNumber(math.Inf(1)); ok { + t.Error("parseNumber should return false for +Inf") + } + + // Test -Inf + if _, ok := d.parseNumber(math.Inf(-1)); ok { + t.Error("parseNumber should return false for -Inf") + } +} // TODO: Missing Edge Case - User Request Extremes: Unknown file extensions. // Test `detectLanguage` with an esoteric extension like `.zig` or `.mojo` or `.xyz`.