فهرست منبع

Fix and subsume `test_issue_2087` into `strconv` test suite

The full "infinity" strings were expected to be partial consumes, but
this is not the case. That has been fixed and the relevant extra tests
from that file have been added to this test suite.

Fixes #2670
Feoramund 1 سال پیش
والد
کامیت
c656a9e4cd
2فایلهای تغییر یافته به همراه60 افزوده شده و 62 حذف شده
  1. 60 0
      tests/core/strconv/test_core_strconv.odin
  2. 0 62
      tests/issues/test_issue_2087.odin

+ 60 - 0
tests/core/strconv/test_core_strconv.odin

@@ -4,6 +4,56 @@ import "core:math"
 import "core:strconv"
 import "core:testing"
 
+@(test)
+test_float :: proc(t: ^testing.T) {
+	n: int
+	f: f64
+	ok: bool
+
+	f, ok = strconv.parse_f64("1.2", &n)
+	testing.expect_value(t, f, 1.2)
+	testing.expect_value(t, n, 3)
+	testing.expect_value(t, ok, true)
+
+	f, ok = strconv.parse_f64("1.2a", &n)
+	testing.expect_value(t, f, 1.2)
+	testing.expect_value(t, n, 3)
+	testing.expect_value(t, ok, false)
+
+	f, ok = strconv.parse_f64("+", &n)
+	testing.expect_value(t, f, 0)
+	testing.expect_value(t, n, 0)
+	testing.expect_value(t, ok, false)
+
+	f, ok = strconv.parse_f64("-", &n)
+	testing.expect_value(t, f, 0)
+	testing.expect_value(t, n, 0)
+	testing.expect_value(t, ok, false)
+
+}
+
+@(test)
+test_nan :: proc(t: ^testing.T) {
+	n: int
+	f: f64
+	ok: bool
+
+	f, ok = strconv.parse_f64("nan", &n)
+	testing.expect_value(t, math.classify(f), math.Float_Class.NaN)
+	testing.expect_value(t, n, 3)
+	testing.expect_value(t, ok, true)
+
+	f, ok = strconv.parse_f64("nAN", &n)
+	testing.expect_value(t, math.classify(f), math.Float_Class.NaN)
+	testing.expect_value(t, n, 3)
+	testing.expect_value(t, ok, true)
+
+	f, ok = strconv.parse_f64("Nani", &n)
+	testing.expect_value(t, math.classify(f), math.Float_Class.NaN)
+	testing.expect_value(t, n, 3)
+	testing.expect_value(t, ok, false)
+}
+
 @(test)
 test_infinity :: proc(t: ^testing.T) {
 	pos_inf := math.inf_f64(+1)
@@ -19,14 +69,17 @@ test_infinity :: proc(t: ^testing.T) {
 			testing.expect_value(t, f, pos_inf)
 			testing.expect_value(t, n, 3)
 			testing.expect_value(t, ok, true)
+			testing.expect_value(t, math.classify(f), math.Float_Class.Inf)
 		} else if i == 8 { // "infinity"
 			testing.expect_value(t, f, pos_inf)
 			testing.expect_value(t, n, 8)
 			testing.expect_value(t, ok, true)
+			testing.expect_value(t, math.classify(f), math.Float_Class.Inf)
 		} else { // invalid substring
 			testing.expect_value(t, f, 0)
 			testing.expect_value(t, n, 0)
 			testing.expect_value(t, ok, false)
+			testing.expect_value(t, math.classify(f), math.Float_Class.Zero)
 		}
 	}
 	
@@ -38,14 +91,17 @@ test_infinity :: proc(t: ^testing.T) {
 			testing.expect_value(t, f, pos_inf)
 			testing.expect_value(t, n, 4)
 			testing.expect_value(t, ok, true)
+			testing.expect_value(t, math.classify(f), math.Float_Class.Inf)
 		} else if i == 9 { // "+infinity"
 			testing.expect_value(t, f, pos_inf)
 			testing.expect_value(t, n, 9)
 			testing.expect_value(t, ok, true)
+			testing.expect_value(t, math.classify(f), math.Float_Class.Inf)
 		} else { // invalid substring
 			testing.expect_value(t, f, 0)
 			testing.expect_value(t, n, 0)
 			testing.expect_value(t, ok, false)
+			testing.expect_value(t, math.classify(f), math.Float_Class.Zero)
 		}
 	}
 
@@ -57,14 +113,17 @@ test_infinity :: proc(t: ^testing.T) {
 			testing.expect_value(t, f, neg_inf)
 			testing.expect_value(t, n, 4)
 			testing.expect_value(t, ok, true)
+			testing.expect_value(t, math.classify(f), math.Float_Class.Neg_Inf)
 		} else if i == 9 { // "-infinity"
 			testing.expect_value(t, f, neg_inf)
 			testing.expect_value(t, n, 9)
 			testing.expect_value(t, ok, true)
+			testing.expect_value(t, math.classify(f), math.Float_Class.Neg_Inf)
 		} else { // invalid substring
 			testing.expect_value(t, f, 0)
 			testing.expect_value(t, n, 0)
 			testing.expect_value(t, ok, false)
+			testing.expect_value(t, math.classify(f), math.Float_Class.Zero)
 		}
 	}
 
@@ -75,5 +134,6 @@ test_infinity :: proc(t: ^testing.T) {
 		testing.expect_value(t, f, pos_inf)
 		testing.expect_value(t, n, 8)
 		testing.expect_value(t, ok, true)
+		testing.expect_value(t, math.classify(f), math.Float_Class.Inf)
 	}
 }

+ 0 - 62
tests/issues/test_issue_2087.odin

@@ -1,62 +0,0 @@
-// Tests issue #2087 https://github.com/odin-lang/Odin/issues/2087
-package test_issues
-
-import "core:math"
-import "core:strconv"
-import "core:testing"
-
-@(test)
-test_parse_float :: proc(t: ^testing.T) {
-	{
-		f, ok := strconv.parse_f64("1.2")
-		testing.expect(t, ok && f == 1.2, "expected f64(1.2), fully consumed")
-		f, ok = strconv.parse_f64("1.2a")
-		testing.expect(t, !ok && f == 1.2, "expected f64(1.2), partially consumed")
-		f, ok = strconv.parse_f64("+")
-		testing.expect(t, !ok && f == 0.0, "expected f64(0.0), with ok=false")
-		f, ok = strconv.parse_f64("-")
-		testing.expect(t, !ok && f == 0.0, "expected f64(0.0), with ok=false")
-
-
-		f, ok = strconv.parse_f64("inf")
-		testing.expect(t, ok && math.classify(f) == math.Float_Class.Inf, "expected f64(+inf), fully consumed")
-		f, ok = strconv.parse_f64("+inf")
-		testing.expect(t, ok && math.classify(f) == math.Float_Class.Inf, "expected f64(+inf), fully consumed")
-		f, ok = strconv.parse_f64("-inf")
-		testing.expect(t, ok && math.classify(f) == math.Float_Class.Neg_Inf, "expected f64(-inf), fully consumed")
-		f, ok = strconv.parse_f64("inFinity")
-		testing.expect(t, !ok && math.classify(f) == math.Float_Class.Inf, "expected f64(+inf), partially consumed")
-		f, ok = strconv.parse_f64("+InFinity")
-		testing.expect(t, !ok && math.classify(f) == math.Float_Class.Inf, "expected f64(+inf), partially consumed")
-		f, ok = strconv.parse_f64("-InfiniTy")
-		testing.expect(t, !ok && math.classify(f) == math.Float_Class.Neg_Inf, "expected f64(-inf), partially consumed")
-		f, ok = strconv.parse_f64("nan")
-		testing.expect(t, ok && math.classify(f) == math.Float_Class.NaN, "expected f64(nan), fully consumed")
-		f, ok = strconv.parse_f64("nAN")
-		testing.expect(t, ok && math.classify(f) == math.Float_Class.NaN, "expected f64(nan), fully consumed")
-	}
-	{
-		f, ok := strconv.parse_f32("1.2")
-		testing.expect(t, ok && f == 1.2, "expected f32(1.2), fully consumed")
-
-		f, ok = strconv.parse_f32("1.2a")
-		testing.expect(t, !ok && f == 1.2, "expected f32(1.2), partially consumed")
-
-		f, ok = strconv.parse_f32("inf")
-		testing.expect(t, ok && math.classify(f) == math.Float_Class.Inf, "expected f32(+inf), fully consumed")
-		f, ok = strconv.parse_f32("+inf")
-		testing.expect(t, ok && math.classify(f) == math.Float_Class.Inf, "expected f32(+inf), fully consumed")
-		f, ok = strconv.parse_f32("-inf")
-		testing.expect(t, ok && math.classify(f) == math.Float_Class.Neg_Inf, "expected f32(-inf), fully consumed")
-		f, ok = strconv.parse_f32("inFinity")
-		testing.expect(t, !ok && math.classify(f) == math.Float_Class.Inf, "expected f32(+inf), partially consumed")
-		f, ok = strconv.parse_f32("+InFinity")
-		testing.expect(t, !ok && math.classify(f) == math.Float_Class.Inf, "expected f32(+inf), partially consumed")
-		f, ok = strconv.parse_f32("-InfiniTy")
-		testing.expect(t, !ok && math.classify(f) == math.Float_Class.Neg_Inf, "expected f32(-inf), partially consumed")
-		f, ok = strconv.parse_f32("nan")
-		testing.expect(t, ok && math.classify(f) == math.Float_Class.NaN, "expected f32(nan), fully consumed")
-		f, ok = strconv.parse_f32("nAN")
-		testing.expect(t, ok && math.classify(f) == math.Float_Class.NaN, "expected f32(nan), fully consumed")
-	}
-}