From c7fa96e3ca418033a88f4b68a81126806490592a Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Sun, 10 Nov 2024 13:43:00 -0500 Subject: [PATCH 1/5] WIP --- gleam.toml | 1 + manifest.toml | 1 + test/data.gleam | 60 +++++ test/data/float/invalid_float_data.gleam | 248 +++++++++--------- test/data/float/valid_float_data.gleam | 241 +++++++++++++---- test/data/integer/invalid_integer_data.gleam | 256 +++++++++---------- test/data/integer/valid_integer_data.gleam | 147 ++++++----- test/helpers.gleam | 1 - test/python/parse_float.py | 6 - test/python/parse_floats.py | 20 ++ test/python/parse_int.py | 7 - test/python/parse_ints.py | 21 ++ test/python/python_parse.gleam | 29 ++- test/python_parse_test.gleam | 37 +-- test/test_data.gleam | 8 +- test/to_float_parse_test.gleam | 6 +- test/to_int_parse_test.gleam | 6 +- 17 files changed, 670 insertions(+), 425 deletions(-) delete mode 100644 test/python/parse_float.py create mode 100644 test/python/parse_floats.py delete mode 100644 test/python/parse_int.py create mode 100644 test/python/parse_ints.py diff --git a/gleam.toml b/gleam.toml index 487b409..30bd6c8 100644 --- a/gleam.toml +++ b/gleam.toml @@ -12,3 +12,4 @@ gleam_stdlib = ">= 0.34.0 and < 2.0.0" startest = ">= 0.5.0 and < 1.0.0" simplifile = ">= 2.2.0 and < 3.0.0" shellout = ">= 1.6.0 and < 2.0.0" +gleam_json = ">= 1.0.1 and < 2.0.0" diff --git a/manifest.toml b/manifest.toml index 92e3577..601dbbc 100644 --- a/manifest.toml +++ b/manifest.toml @@ -25,6 +25,7 @@ packages = [ ] [requirements] +gleam_json = { version = ">= 1.0.1 and < 2.0.0" } gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" } shellout = { version = ">= 1.6.0 and < 2.0.0" } simplifile = { version = ">= 2.2.0 and < 3.0.0" } diff --git a/test/data.gleam b/test/data.gleam index 737a05b..9614dd7 100644 --- a/test/data.gleam +++ b/test/data.gleam @@ -2,7 +2,11 @@ import data/float/invalid_float_data import data/float/valid_float_data import data/integer/invalid_integer_data import data/integer/valid_integer_data +import gleam/dynamic +import gleam/int +import gleam/json import gleam/list +import python/python_parse import test_data.{type FloatTestData, type IntegerTestData} pub fn float_data() -> List(FloatTestData) { @@ -14,3 +18,59 @@ pub fn integer_data() -> List(IntegerTestData) { [valid_integer_data.data(), invalid_integer_data.data()] |> list.flatten } + +pub fn python_processed_float_data() { + let integer_data = float_data() + let input_json_string = + integer_data + |> json.array(fn(data) { + json.object([#("input", json.string(data.input))]) + }) + |> json.to_string + + let assert Ok(output_json_string) = python_parse.to_floats(input_json_string) + + let assert Ok(processed_strings) = + json.decode(output_json_string, dynamic.list(of: dynamic.string)) + + let processed_values = + processed_strings + |> list.map(fn(value) { + case value { + "Nil" -> Error(Nil) + _ -> Ok(value) + } + }) + + integer_data |> list.zip(processed_values) +} + +pub fn python_processed_integer_data() { + let integer_data = integer_data() + let input_json_string = + integer_data + |> json.array(fn(data) { + json.object([ + #("input", json.string(data.input)), + #("base", json.string(data.base |> int.to_string)), + ]) + }) + |> json.to_string + + let assert Ok(output_json_string) = python_parse.to_ints(input_json_string) + + let assert Ok(processed_strings) = + json.decode(output_json_string, dynamic.list(of: dynamic.string)) + + let processed_values = + processed_strings + |> list.map(fn(value) { + case value { + "Nil" -> Error(Nil) + _ -> Ok(value) + } + }) + + integer_data |> list.zip(processed_values) +} +// TODO - test python parsing directly diff --git a/test/data/float/invalid_float_data.gleam b/test/data/float/invalid_float_data.gleam index b628c94..b460ad2 100644 --- a/test/data/float/invalid_float_data.gleam +++ b/test/data/float/invalid_float_data.gleam @@ -8,328 +8,328 @@ import test_data.{type FloatTestData, FloatTestData} const invalid_empty_or_whitespace: List(FloatTestData) = [ FloatTestData( input: "", - output: Error(EmptyString), - python_output: Error(Nil), + expected_program_output: Error(EmptyString), + expected_python_output: Error(Nil), ), FloatTestData( input: " ", - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), FloatTestData( input: "\t", - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), FloatTestData( input: "\n", - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), FloatTestData( input: "\r", - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), FloatTestData( input: "\f", - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), FloatTestData( input: "\r\n", - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), FloatTestData( input: " \t\n\r\f ", - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), FloatTestData( input: " \t ", - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), ] const invalid_decimal_positions: List(FloatTestData) = [ FloatTestData( input: "..1", - output: Error(InvalidDecimalPosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1..", - output: Error(InvalidDecimalPosition(2)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(2)), + expected_python_output: Error(Nil), ), FloatTestData( input: ".1.", - output: Error(InvalidDecimalPosition(2)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(2)), + expected_python_output: Error(Nil), ), FloatTestData( input: ".", - output: Error(InvalidDecimalPosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "..", - output: Error(InvalidDecimalPosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(0)), + expected_python_output: Error(Nil), ), FloatTestData( input: " .", - output: Error(InvalidDecimalPosition(1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(1)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1.2.3", - output: Error(InvalidDecimalPosition(3)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(3)), + expected_python_output: Error(Nil), ), FloatTestData( input: ".1.2", - output: Error(InvalidDecimalPosition(2)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(2)), + expected_python_output: Error(Nil), ), ] const invalid_underscore_positions: List(FloatTestData) = [ FloatTestData( input: "_.", - output: Error(InvalidUnderscorePosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "._", - output: Error(InvalidUnderscorePosition(1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(1)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1_.000", - output: Error(InvalidUnderscorePosition(1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(1)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1._000", - output: Error(InvalidUnderscorePosition(2)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(2)), + expected_python_output: Error(Nil), ), FloatTestData( input: "_1000.0", - output: Error(InvalidUnderscorePosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1000.0_", - output: Error(InvalidUnderscorePosition(6)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(6)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1000._0", - output: Error(InvalidUnderscorePosition(5)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(5)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1000_.0", - output: Error(InvalidUnderscorePosition(4)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(4)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1000_.", - output: Error(InvalidUnderscorePosition(4)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(4)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1_000__000.0", - output: Error(InvalidUnderscorePosition(6)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(6)), + expected_python_output: Error(Nil), ), FloatTestData( input: "_1_000.0", - output: Error(InvalidUnderscorePosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1_000.0_", - output: Error(InvalidUnderscorePosition(7)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(7)), + expected_python_output: Error(Nil), ), ] const invalid_characters: List(FloatTestData) = [ FloatTestData( input: ". ", - output: Error(UnknownCharacter(" ", 1)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(" ", 1)), + expected_python_output: Error(Nil), ), FloatTestData( input: "abc", - output: Error(UnknownCharacter("a", 0)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter("a", 0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "100.00c01", - output: Error(UnknownCharacter("c", 6)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter("c", 6)), + expected_python_output: Error(Nil), ), FloatTestData( input: "3.14f", - output: Error(UnknownCharacter("f", 4)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter("f", 4)), + expected_python_output: Error(Nil), ), FloatTestData( input: "$100.00", - output: Error(UnknownCharacter("$", 0)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter("$", 0)), + expected_python_output: Error(Nil), ), ] const invalid_exponent_positions: List(FloatTestData) = [ FloatTestData( input: "e", - output: Error(InvalidExponentSymbolPosition("e", 0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("e", 0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "E", - output: Error(InvalidExponentSymbolPosition("E", 0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("E", 0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "e4", - output: Error(InvalidExponentSymbolPosition("e", 0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("e", 0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "E4", - output: Error(InvalidExponentSymbolPosition("E", 0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("E", 0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "4e", - output: Error(InvalidExponentSymbolPosition("e", 1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("e", 1)), + expected_python_output: Error(Nil), ), FloatTestData( input: "4E", - output: Error(InvalidExponentSymbolPosition("E", 1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("E", 1)), + expected_python_output: Error(Nil), ), FloatTestData( input: "4.e", - output: Error(InvalidExponentSymbolPosition("e", 2)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("e", 2)), + expected_python_output: Error(Nil), ), FloatTestData( input: "4.E", - output: Error(InvalidExponentSymbolPosition("E", 2)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("E", 2)), + expected_python_output: Error(Nil), ), FloatTestData( input: "4e.", - output: Error(InvalidExponentSymbolPosition("e", 1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("e", 1)), + expected_python_output: Error(Nil), ), FloatTestData( input: "4E.", - output: Error(InvalidExponentSymbolPosition("E", 1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("E", 1)), + expected_python_output: Error(Nil), ), FloatTestData( input: "E4.0", - output: Error(InvalidExponentSymbolPosition("E", 0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("E", 0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "4.0E", - output: Error(InvalidExponentSymbolPosition("E", 3)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("E", 3)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1_234.e-4e", - output: Error(InvalidExponentSymbolPosition("e", 9)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("e", 9)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1e2e3", - output: Error(InvalidExponentSymbolPosition("e", 3)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("e", 3)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1E2E3", - output: Error(InvalidExponentSymbolPosition("E", 3)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("E", 3)), + expected_python_output: Error(Nil), ), ] const invalid_mixed: List(FloatTestData) = [ FloatTestData( input: "4.0E_2", - output: Error(InvalidUnderscorePosition(4)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(4)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1.2e_3", - output: Error(InvalidUnderscorePosition(4)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(4)), + expected_python_output: Error(Nil), ), FloatTestData( input: "4.0_E2", - output: Error(InvalidUnderscorePosition(3)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(3)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1_234.e-4.3", - output: Error(InvalidDecimalPosition(9)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(9)), + expected_python_output: Error(Nil), ), FloatTestData( input: "_1.2e3", - output: Error(InvalidUnderscorePosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(0)), + expected_python_output: Error(Nil), ), FloatTestData( input: "1.2e3_", - output: Error(InvalidUnderscorePosition(5)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(5)), + expected_python_output: Error(Nil), ), FloatTestData( input: ".e", - output: Error(InvalidDecimalPosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(0)), + expected_python_output: Error(Nil), ), FloatTestData( input: ".E", - output: Error(InvalidDecimalPosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(0)), + expected_python_output: Error(Nil), ), FloatTestData( input: ".e4", - output: Error(InvalidDecimalPosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(0)), + expected_python_output: Error(Nil), ), FloatTestData( input: ".E4", - output: Error(InvalidDecimalPosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDecimalPosition(0)), + expected_python_output: Error(Nil), ), FloatTestData( input: " 4.0E", - output: Error(InvalidExponentSymbolPosition("E", 4)), - python_output: Error(Nil), + expected_program_output: Error(InvalidExponentSymbolPosition("E", 4)), + expected_python_output: Error(Nil), ), FloatTestData( input: "4.0E ", - output: Error(UnknownCharacter(" ", 4)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(" ", 4)), + expected_python_output: Error(Nil), ), FloatTestData( input: " 4.0E ", - output: Error(UnknownCharacter(" ", 5)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(" ", 5)), + expected_python_output: Error(Nil), ), ] diff --git a/test/data/float/valid_float_data.gleam b/test/data/float/valid_float_data.gleam index d6a696a..d5fd806 100644 --- a/test/data/float/valid_float_data.gleam +++ b/test/data/float/valid_float_data.gleam @@ -2,108 +2,237 @@ import gleam/list import test_data.{type FloatTestData, FloatTestData} const valid_simple_floats: List(FloatTestData) = [ - FloatTestData(input: "1.001", output: Ok(1.001), python_output: Ok("1.001")), - FloatTestData(input: "1.00", output: Ok(1.0), python_output: Ok("1.0")), - FloatTestData(input: "1.0", output: Ok(1.0), python_output: Ok("1.0")), - FloatTestData(input: "0.1", output: Ok(0.1), python_output: Ok("0.1")), - FloatTestData(input: "+1.0", output: Ok(1.0), python_output: Ok("1.0")), - FloatTestData(input: "-1.0", output: Ok(-1.0), python_output: Ok("-1.0")), + FloatTestData( + input: "1.001", + expected_program_output: Ok(1.001), + expected_python_output: Ok("1.001"), + ), + FloatTestData( + input: "1.00", + expected_program_output: Ok(1.0), + expected_python_output: Ok("1.0"), + ), + FloatTestData( + input: "1.0", + expected_program_output: Ok(1.0), + expected_python_output: Ok("1.0"), + ), + FloatTestData( + input: "0.1", + expected_program_output: Ok(0.1), + expected_python_output: Ok("0.1"), + ), + FloatTestData( + input: "+1.0", + expected_program_output: Ok(1.0), + expected_python_output: Ok("1.0"), + ), + FloatTestData( + input: "-1.0", + expected_program_output: Ok(-1.0), + expected_python_output: Ok("-1.0"), + ), FloatTestData( input: "+123.321", - output: Ok(123.321), - python_output: Ok("123.321"), + expected_program_output: Ok(123.321), + expected_python_output: Ok("123.321"), ), FloatTestData( input: "-123.321", - output: Ok(-123.321), - python_output: Ok("-123.321"), - ), FloatTestData(input: "1", output: Ok(1.0), python_output: Ok("1.0")), - FloatTestData(input: "1.", output: Ok(1.0), python_output: Ok("1.0")), - FloatTestData(input: ".1", output: Ok(0.1), python_output: Ok("0.1")), - FloatTestData(input: "0", output: Ok(0.0), python_output: Ok("0.0")), - FloatTestData(input: "-0", output: Ok(-0.0), python_output: Ok("-0.0")), - FloatTestData(input: "+0", output: Ok(0.0), python_output: Ok("0.0")), - FloatTestData(input: "0.0", output: Ok(0.0), python_output: Ok("0.0")), + expected_program_output: Ok(-123.321), + expected_python_output: Ok("-123.321"), + ), + FloatTestData( + input: "1", + expected_program_output: Ok(1.0), + expected_python_output: Ok("1.0"), + ), + FloatTestData( + input: "1.", + expected_program_output: Ok(1.0), + expected_python_output: Ok("1.0"), + ), + FloatTestData( + input: ".1", + expected_program_output: Ok(0.1), + expected_python_output: Ok("0.1"), + ), + FloatTestData( + input: "0", + expected_program_output: Ok(0.0), + expected_python_output: Ok("0.0"), + ), + FloatTestData( + input: "-0", + expected_program_output: Ok(-0.0), + expected_python_output: Ok("-0.0"), + ), + FloatTestData( + input: "+0", + expected_program_output: Ok(0.0), + expected_python_output: Ok("0.0"), + ), + FloatTestData( + input: "0.0", + expected_program_output: Ok(0.0), + expected_python_output: Ok("0.0"), + ), ] const valid_floats_with_underscores: List(FloatTestData) = [ FloatTestData( input: "1_000_000.0", - output: Ok(1_000_000.0), - python_output: Ok("1000000.0"), + expected_program_output: Ok(1_000_000.0), + expected_python_output: Ok("1000000.0"), ), FloatTestData( input: "1_000_000.000_1", - output: Ok(1_000_000.0001), - python_output: Ok("1000000.0001"), + expected_program_output: Ok(1_000_000.0001), + expected_python_output: Ok("1000000.0001"), ), FloatTestData( input: "1000.000_000", - output: Ok(1000.0), - python_output: Ok("1000.0"), + expected_program_output: Ok(1000.0), + expected_python_output: Ok("1000.0"), ), FloatTestData( input: "1_234_567.890_123", - output: Ok(1_234_567.890123), - python_output: Ok("1234567.890123"), + expected_program_output: Ok(1_234_567.890123), + expected_python_output: Ok("1234567.890123"), ), FloatTestData( input: "0.000_000_1", - output: Ok(0.0000001), - python_output: Ok("1e-07"), + expected_program_output: Ok(0.0000001), + expected_python_output: Ok("1e-07"), ), ] const valid_floats_with_whitespace: List(FloatTestData) = [ - FloatTestData(input: " 1 ", output: Ok(1.0), python_output: Ok("1.0")), - FloatTestData(input: " 1.0 ", output: Ok(1.0), python_output: Ok("1.0")), + FloatTestData( + input: " 1 ", + expected_program_output: Ok(1.0), + expected_python_output: Ok("1.0"), + ), + FloatTestData( + input: " 1.0 ", + expected_program_output: Ok(1.0), + expected_python_output: Ok("1.0"), + ), FloatTestData( input: " 1000 ", - output: Ok(1000.0), - python_output: Ok("1000.0"), + expected_program_output: Ok(1000.0), + expected_python_output: Ok("1000.0"), + ), + FloatTestData( + input: "\t3.14\n", + expected_program_output: Ok(3.14), + expected_python_output: Ok("3.14"), + ), + FloatTestData( + input: " -0.5 ", + expected_program_output: Ok(-0.5), + expected_python_output: Ok("-0.5"), ), - FloatTestData(input: "\t3.14\n", output: Ok(3.14), python_output: Ok("3.14")), - FloatTestData(input: " -0.5 ", output: Ok(-0.5), python_output: Ok("-0.5")), ] const valid_floats_with_exponents: List(FloatTestData) = [ - FloatTestData(input: "4e3", output: Ok(4000.0), python_output: Ok("4000.0")), - FloatTestData(input: "4e-3", output: Ok(0.004), python_output: Ok("0.004")), - FloatTestData(input: "4.0e3", output: Ok(4000.0), python_output: Ok("4000.0")), - FloatTestData(input: "4.0e-3", output: Ok(0.004), python_output: Ok("0.004")), - FloatTestData(input: "4E3", output: Ok(4000.0), python_output: Ok("4000.0")), - FloatTestData(input: "4E-3", output: Ok(0.004), python_output: Ok("0.004")), - FloatTestData(input: "4.0E3", output: Ok(4000.0), python_output: Ok("4000.0")), - FloatTestData(input: "4.0E-3", output: Ok(0.004), python_output: Ok("0.004")), - FloatTestData(input: ".3e3", output: Ok(300.0), python_output: Ok("300.0")), - FloatTestData(input: ".3e-3", output: Ok(0.0003), python_output: Ok("0.0003")), - FloatTestData(input: "3.e3", output: Ok(3000.0), python_output: Ok("3000.0")), - FloatTestData(input: "3.e-3", output: Ok(0.003), python_output: Ok("0.003")), - FloatTestData(input: "1e0", output: Ok(1.0), python_output: Ok("1.0")), - FloatTestData(input: "1e+3", output: Ok(1000.0), python_output: Ok("1000.0")), - FloatTestData(input: "1E+3", output: Ok(1000.0), python_output: Ok("1000.0")), + FloatTestData( + input: "4e3", + expected_program_output: Ok(4000.0), + expected_python_output: Ok("4000.0"), + ), + FloatTestData( + input: "4e-3", + expected_program_output: Ok(0.004), + expected_python_output: Ok("0.004"), + ), + FloatTestData( + input: "4.0e3", + expected_program_output: Ok(4000.0), + expected_python_output: Ok("4000.0"), + ), + FloatTestData( + input: "4.0e-3", + expected_program_output: Ok(0.004), + expected_python_output: Ok("0.004"), + ), + FloatTestData( + input: "4E3", + expected_program_output: Ok(4000.0), + expected_python_output: Ok("4000.0"), + ), + FloatTestData( + input: "4E-3", + expected_program_output: Ok(0.004), + expected_python_output: Ok("0.004"), + ), + FloatTestData( + input: "4.0E3", + expected_program_output: Ok(4000.0), + expected_python_output: Ok("4000.0"), + ), + FloatTestData( + input: "4.0E-3", + expected_program_output: Ok(0.004), + expected_python_output: Ok("0.004"), + ), + FloatTestData( + input: ".3e3", + expected_program_output: Ok(300.0), + expected_python_output: Ok("300.0"), + ), + FloatTestData( + input: ".3e-3", + expected_program_output: Ok(0.0003), + expected_python_output: Ok("0.0003"), + ), + FloatTestData( + input: "3.e3", + expected_program_output: Ok(3000.0), + expected_python_output: Ok("3000.0"), + ), + FloatTestData( + input: "3.e-3", + expected_program_output: Ok(0.003), + expected_python_output: Ok("0.003"), + ), + FloatTestData( + input: "1e0", + expected_program_output: Ok(1.0), + expected_python_output: Ok("1.0"), + ), + FloatTestData( + input: "1e+3", + expected_program_output: Ok(1000.0), + expected_python_output: Ok("1000.0"), + ), + FloatTestData( + input: "1E+3", + expected_program_output: Ok(1000.0), + expected_python_output: Ok("1000.0"), + ), ] const valid_mixed: List(FloatTestData) = [ FloatTestData( input: " -30.01e-2 ", - output: Ok(-0.3001), - python_output: Ok("-0.3001"), + expected_program_output: Ok(-0.3001), + expected_python_output: Ok("-0.3001"), ), FloatTestData( input: "+1_234.567_8e-2", - output: Ok(12.345678), - python_output: Ok("12.345678"), + expected_program_output: Ok(12.345678), + expected_python_output: Ok("12.345678"), ), FloatTestData( input: "-1_234.567_8e-2", - output: Ok(-12.345678), - python_output: Ok("-12.345678"), + expected_program_output: Ok(-12.345678), + expected_python_output: Ok("-12.345678"), ), FloatTestData( input: " -0.000_1E+3 ", - output: Ok(-0.1), - python_output: Ok("-0.1"), + expected_program_output: Ok(-0.1), + expected_python_output: Ok("-0.1"), ), ] diff --git a/test/data/integer/invalid_integer_data.gleam b/test/data/integer/invalid_integer_data.gleam index 466e9cc..295ef81 100644 --- a/test/data/integer/invalid_integer_data.gleam +++ b/test/data/integer/invalid_integer_data.gleam @@ -10,56 +10,56 @@ const invalid_empty_or_whitespace: List(IntegerTestData) = [ IntegerTestData( input: "", base: 10, - output: Error(EmptyString), - python_output: Error(Nil), + expected_program_output: Error(EmptyString), + expected_python_output: Error(Nil), ), IntegerTestData( input: " ", base: 10, - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), IntegerTestData( input: "\t", base: 10, - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), IntegerTestData( input: "\n", base: 10, - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), IntegerTestData( input: "\r", base: 10, - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), IntegerTestData( input: "\f", base: 10, - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), IntegerTestData( input: "\r\n", base: 10, - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), IntegerTestData( input: " \t\n\r\f\r\n ", base: 10, - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), IntegerTestData( input: " ", base: 10, - output: Error(WhitespaceOnlyString), - python_output: Error(Nil), + expected_program_output: Error(WhitespaceOnlyString), + expected_python_output: Error(Nil), ), ] @@ -67,68 +67,68 @@ const invalid_underscore_positions: List(IntegerTestData) = [ IntegerTestData( input: "_", base: 10, - output: Error(InvalidUnderscorePosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "_1000", base: 10, - output: Error(InvalidUnderscorePosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1000_", base: 10, - output: Error(InvalidUnderscorePosition(4)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(4)), + expected_python_output: Error(Nil), ), IntegerTestData( input: " _1000", base: 10, - output: Error(InvalidUnderscorePosition(1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1000_ ", base: 10, - output: Error(InvalidUnderscorePosition(4)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(4)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "+_1000", base: 10, - output: Error(InvalidUnderscorePosition(1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "-_1000", base: 10, - output: Error(InvalidUnderscorePosition(1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1__000", base: 10, - output: Error(InvalidUnderscorePosition(2)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(2)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1_000__000", base: 10, - output: Error(InvalidUnderscorePosition(6)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(6)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "_1_000", base: 10, - output: Error(InvalidUnderscorePosition(0)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1_000_", base: 10, - output: Error(InvalidUnderscorePosition(5)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(5)), + expected_python_output: Error(Nil), ), ] @@ -136,56 +136,56 @@ const invalid_characters: List(IntegerTestData) = [ IntegerTestData( input: "+ 1", base: 10, - output: Error(UnknownCharacter(" ", 1)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(" ", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: ".", base: 10, - output: Error(UnknownCharacter(".", 0)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(".", 0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "..", base: 10, - output: Error(UnknownCharacter(".", 0)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(".", 0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "0.0.", base: 10, - output: Error(UnknownCharacter(".", 1)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(".", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: ".0.0", base: 10, - output: Error(UnknownCharacter(".", 0)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(".", 0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1.", base: 10, - output: Error(UnknownCharacter(".", 1)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(".", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1.0", base: 10, - output: Error(UnknownCharacter(".", 1)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(".", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1$", base: 10, - output: Error(UnknownCharacter("$", 1)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter("$", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "#123", base: 10, - output: Error(UnknownCharacter("#", 0)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter("#", 0)), + expected_python_output: Error(Nil), ), ] @@ -193,68 +193,68 @@ const invalid_base_range: List(IntegerTestData) = [ IntegerTestData( input: "a", base: 10, - output: Error(OutOfBaseRange("a", 10, 10, 0)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("a", 10, 10, 0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1b1", base: 10, - output: Error(OutOfBaseRange("b", 11, 10, 1)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("b", 11, 10, 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "abc", base: 10, - output: Error(OutOfBaseRange("a", 10, 10, 0)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("a", 10, 10, 0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "e", base: 10, - output: Error(OutOfBaseRange("e", 14, 10, 0)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("e", 14, 10, 0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "E", base: 10, - output: Error(OutOfBaseRange("E", 14, 10, 0)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("E", 14, 10, 0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "e13", base: 10, - output: Error(OutOfBaseRange("e", 14, 10, 0)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("e", 14, 10, 0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1e3", base: 10, - output: Error(OutOfBaseRange("e", 14, 10, 1)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("e", 14, 10, 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "13e", base: 10, - output: Error(OutOfBaseRange("e", 14, 10, 2)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("e", 14, 10, 2)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "E13", base: 10, - output: Error(OutOfBaseRange("E", 14, 10, 0)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("E", 14, 10, 0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1E3", base: 10, - output: Error(OutOfBaseRange("E", 14, 10, 1)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("E", 14, 10, 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "13E", base: 10, - output: Error(OutOfBaseRange("E", 14, 10, 2)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("E", 14, 10, 2)), + expected_python_output: Error(Nil), ), ] @@ -262,26 +262,26 @@ const invalid_digit_positions: List(IntegerTestData) = [ IntegerTestData( input: "1 1", base: 10, - output: Error(InvalidDigitPosition("1", 2)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDigitPosition("1", 2)), + expected_python_output: Error(Nil), ), IntegerTestData( input: " 12 34 ", base: 10, - output: Error(InvalidDigitPosition("3", 4)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDigitPosition("3", 4)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1 2 3", base: 10, - output: Error(InvalidDigitPosition("2", 2)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDigitPosition("2", 2)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "123 456", base: 10, - output: Error(InvalidDigitPosition("4", 4)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDigitPosition("4", 4)), + expected_python_output: Error(Nil), ), ] @@ -289,38 +289,38 @@ const invalid_sign_positions: List(IntegerTestData) = [ IntegerTestData( input: "1+", base: 10, - output: Error(InvalidSignPosition("+", 1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidSignPosition("+", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1-", base: 10, - output: Error(InvalidSignPosition("-", 1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidSignPosition("-", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1+1", base: 10, - output: Error(InvalidSignPosition("+", 1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidSignPosition("+", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1-1", base: 10, - output: Error(InvalidSignPosition("-", 1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidSignPosition("-", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "++1", base: 10, - output: Error(InvalidSignPosition("+", 1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidSignPosition("+", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "--1", base: 10, - output: Error(InvalidSignPosition("-", 1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidSignPosition("-", 1)), + expected_python_output: Error(Nil), ), ] @@ -328,14 +328,14 @@ const invalid_base_configurations: List(IntegerTestData) = [ IntegerTestData( input: "151", base: 2, - output: Error(OutOfBaseRange("5", 5, 2, 1)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("5", 5, 2, 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "DEAD_BEEF", base: 10, - output: Error(OutOfBaseRange("D", 13, 10, 0)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("D", 13, 10, 0)), + expected_python_output: Error(Nil), ), ] @@ -343,14 +343,14 @@ const invalid_base_value: List(IntegerTestData) = [ IntegerTestData( input: "151", base: 1, - output: Error(InvalidBaseValue(1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidBaseValue(1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "151", base: 37, - output: Error(InvalidBaseValue(37)), - python_output: Error(Nil), + expected_program_output: Error(InvalidBaseValue(37)), + expected_python_output: Error(Nil), ), ] @@ -358,62 +358,62 @@ const invalid_mixed: List(IntegerTestData) = [ IntegerTestData( input: "e_1_3", base: 10, - output: Error(OutOfBaseRange("e", 14, 10, 0)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("e", 14, 10, 0)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1_3_e", base: 10, - output: Error(OutOfBaseRange("e", 14, 10, 4)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("e", 14, 10, 4)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1._3_e", base: 10, - output: Error(UnknownCharacter(".", 1)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(".", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1+._3_e", base: 10, - output: Error(InvalidSignPosition("+", 1)), - python_output: Error(Nil), + expected_program_output: Error(InvalidSignPosition("+", 1)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1 1+._3_e", base: 10, - output: Error(InvalidDigitPosition("1", 2)), - python_output: Error(Nil), + expected_program_output: Error(InvalidDigitPosition("1", 2)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "1_a_2", base: 10, - output: Error(OutOfBaseRange("a", 10, 10, 2)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("a", 10, 10, 2)), + expected_python_output: Error(Nil), ), IntegerTestData( input: "+1.2_3", base: 10, - output: Error(UnknownCharacter(".", 2)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(".", 2)), + expected_python_output: Error(Nil), ), IntegerTestData( input: " 1_f_1 ", base: 2, - output: Error(OutOfBaseRange("f", 15, 2, 4)), - python_output: Error(Nil), + expected_program_output: Error(OutOfBaseRange("f", 15, 2, 4)), + expected_python_output: Error(Nil), ), IntegerTestData( input: " 1._5_1 ", base: 2, - output: Error(UnknownCharacter(".", 3)), - python_output: Error(Nil), + expected_program_output: Error(UnknownCharacter(".", 3)), + expected_python_output: Error(Nil), ), IntegerTestData( input: " 1_1__1 ", base: 2, - output: Error(InvalidUnderscorePosition(6)), - python_output: Error(Nil), + expected_program_output: Error(InvalidUnderscorePosition(6)), + expected_python_output: Error(Nil), ), ] diff --git a/test/data/integer/valid_integer_data.gleam b/test/data/integer/valid_integer_data.gleam index a72b284..a615906 100644 --- a/test/data/integer/valid_integer_data.gleam +++ b/test/data/integer/valid_integer_data.gleam @@ -2,49 +2,59 @@ import gleam/list import test_data.{type IntegerTestData, IntegerTestData} const valid_simple_integers: List(IntegerTestData) = [ - IntegerTestData(input: "1", base: 10, output: Ok(1), python_output: Ok("1")), + IntegerTestData( + input: "1", + base: 10, + expected_program_output: Ok(1), + expected_python_output: Ok("1"), + ), IntegerTestData( input: "+123", base: 10, - output: Ok(123), - python_output: Ok("123"), + expected_program_output: Ok(123), + expected_python_output: Ok("123"), ), IntegerTestData( input: "-123", base: 10, - output: Ok(-123), - python_output: Ok("-123"), + expected_program_output: Ok(-123), + expected_python_output: Ok("-123"), ), IntegerTestData( input: "0123", base: 10, - output: Ok(123), - python_output: Ok("123"), + expected_program_output: Ok(123), + expected_python_output: Ok("123"), ), IntegerTestData( input: "9876", base: 10, - output: Ok(9876), - python_output: Ok("9876"), + expected_program_output: Ok(9876), + expected_python_output: Ok("9876"), ), IntegerTestData( input: "-10", base: 10, - output: Ok(-10), - python_output: Ok("-10"), + expected_program_output: Ok(-10), + expected_python_output: Ok("-10"), + ), + IntegerTestData( + input: "+0", + base: 10, + expected_program_output: Ok(0), + expected_python_output: Ok("0"), ), - IntegerTestData(input: "+0", base: 10, output: Ok(0), python_output: Ok("0")), IntegerTestData( input: "42", base: 10, - output: Ok(42), - python_output: Ok("42"), + expected_program_output: Ok(42), + expected_python_output: Ok("42"), ), IntegerTestData( input: "-987654", base: 10, - output: Ok(-987_654), - python_output: Ok("-987654"), + expected_program_output: Ok(-987_654), + expected_python_output: Ok("-987654"), ), ] @@ -52,38 +62,38 @@ const valid_integers_with_underscores: List(IntegerTestData) = [ IntegerTestData( input: "1_000", base: 10, - output: Ok(1000), - python_output: Ok("1000"), + expected_program_output: Ok(1000), + expected_python_output: Ok("1000"), ), IntegerTestData( input: "1_000_000", base: 10, - output: Ok(1_000_000), - python_output: Ok("1000000"), + expected_program_output: Ok(1_000_000), + expected_python_output: Ok("1000000"), ), IntegerTestData( input: "1_234_567_890", base: 10, - output: Ok(1_234_567_890), - python_output: Ok("1234567890"), + expected_program_output: Ok(1_234_567_890), + expected_python_output: Ok("1234567890"), ), IntegerTestData( input: "-1_000_000", base: 10, - output: Ok(-1_000_000), - python_output: Ok("-1000000"), + expected_program_output: Ok(-1_000_000), + expected_python_output: Ok("-1000000"), ), IntegerTestData( input: "+1_234_567", base: 10, - output: Ok(1_234_567), - python_output: Ok("1234567"), + expected_program_output: Ok(1_234_567), + expected_python_output: Ok("1234567"), ), IntegerTestData( input: "9_876_543_210", base: 10, - output: Ok(9_876_543_210), - python_output: Ok("9876543210"), + expected_program_output: Ok(9_876_543_210), + expected_python_output: Ok("9876543210"), ), ] @@ -91,89 +101,104 @@ const valid_integers_with_whitespace: List(IntegerTestData) = [ IntegerTestData( input: " +123 ", base: 10, - output: Ok(123), - python_output: Ok("123"), + expected_program_output: Ok(123), + expected_python_output: Ok("123"), ), IntegerTestData( input: " -123 ", base: 10, - output: Ok(-123), - python_output: Ok("-123"), + expected_program_output: Ok(-123), + expected_python_output: Ok("-123"), ), IntegerTestData( input: " 0123", base: 10, - output: Ok(123), - python_output: Ok("123"), + expected_program_output: Ok(123), + expected_python_output: Ok("123"), + ), + IntegerTestData( + input: " 1 ", + base: 10, + expected_program_output: Ok(1), + expected_python_output: Ok("1"), ), - IntegerTestData(input: " 1 ", base: 10, output: Ok(1), python_output: Ok("1")), IntegerTestData( input: "42 ", base: 10, - output: Ok(42), - python_output: Ok("42"), + expected_program_output: Ok(42), + expected_python_output: Ok("42"), ), IntegerTestData( input: " +0 ", base: 10, - output: Ok(0), - python_output: Ok("0"), + expected_program_output: Ok(0), + expected_python_output: Ok("0"), ), IntegerTestData( input: " -987 ", base: 10, - output: Ok(-987), - python_output: Ok("-987"), + expected_program_output: Ok(-987), + expected_python_output: Ok("-987"), ), IntegerTestData( input: "\t123\t", base: 10, - output: Ok(123), - python_output: Ok("123"), + expected_program_output: Ok(123), + expected_python_output: Ok("123"), ), IntegerTestData( input: "\n456\n", base: 10, - output: Ok(456), - python_output: Ok("456"), + expected_program_output: Ok(456), + expected_python_output: Ok("456"), ), ] const valid_simple_integers_base_2: List(IntegerTestData) = [ - IntegerTestData(input: "0", base: 2, output: Ok(0), python_output: Ok("0")), + IntegerTestData( + input: "0", + base: 2, + expected_program_output: Ok(0), + expected_python_output: Ok("0"), + ), IntegerTestData( input: "101", base: 2, - output: Ok(0b101), - python_output: Ok("5"), + expected_program_output: Ok(0b101), + expected_python_output: Ok("5"), ), IntegerTestData( input: "11111", base: 2, - output: Ok(0b11111), - python_output: Ok("31"), + expected_program_output: Ok(0b11111), + expected_python_output: Ok("31"), ), IntegerTestData( input: "-11111", base: 2, - output: Ok(-31), - python_output: Ok("-31"), + expected_program_output: Ok(-31), + expected_python_output: Ok("-31"), ), IntegerTestData( input: " 1_1_1 ", base: 2, - output: Ok(0b111), - python_output: Ok("7"), + expected_program_output: Ok(0b111), + expected_python_output: Ok("7"), ), ] const valid_simple_integers_base_8: List(IntegerTestData) = [ - IntegerTestData(input: "0", base: 8, output: Ok(0), python_output: Ok("0")), + IntegerTestData( + input: "0", + base: 8, + expected_program_output: Ok(0), + expected_python_output: Ok("0"), + ), IntegerTestData( input: "77", base: 8, - output: Ok(0o77), - python_output: Ok("63"), + expected_program_output: Ok(0o77), + expected_python_output: Ok("63"), ), ] @@ -181,14 +206,14 @@ const valid_simple_integers_base_16: List(IntegerTestData) = [ IntegerTestData( input: "DEAD_BEEF", base: 16, - output: Ok(0xDEADBEEF), - python_output: Ok("3735928559"), + expected_program_output: Ok(0xDEADBEEF), + expected_python_output: Ok("3735928559"), ), IntegerTestData( input: "ABCDEF", base: 16, - output: Ok(0xABCDEF), - python_output: Ok("11259375"), + expected_program_output: Ok(0xABCDEF), + expected_python_output: Ok("11259375"), ), ] diff --git a/test/helpers.gleam b/test/helpers.gleam index 398fce8..a60c953 100644 --- a/test/helpers.gleam +++ b/test/helpers.gleam @@ -1,6 +1,5 @@ import gleam/string -@internal pub fn to_printable_text(text: String) -> String { do_to_printable_text(text |> string.to_graphemes, "") } diff --git a/test/python/parse_float.py b/test/python/parse_float.py deleted file mode 100644 index a0b665d..0000000 --- a/test/python/parse_float.py +++ /dev/null @@ -1,6 +0,0 @@ -import sys - -text = sys.argv[1] -parsed_float = float(text) - -print(parsed_float, end="") diff --git a/test/python/parse_floats.py b/test/python/parse_floats.py new file mode 100644 index 0000000..3356af5 --- /dev/null +++ b/test/python/parse_floats.py @@ -0,0 +1,20 @@ +import json +import sys + +json_data = sys.argv[1] +data_list = json.loads(json_data) +output_values = [] + +for item in data_list: + text = item["input"] + + try: + value = float(text) + except Exception: + value = "Nil" + + output_values.append(str(value)) + +json_output = json.dumps(output_values) + +print(json_output, end="") diff --git a/test/python/parse_int.py b/test/python/parse_int.py deleted file mode 100644 index 00b4c8c..0000000 --- a/test/python/parse_int.py +++ /dev/null @@ -1,7 +0,0 @@ -import sys - -text = sys.argv[1] -base = int(sys.argv[2]) -parsed_int = int(text, base=base) - -print(parsed_int, end="") diff --git a/test/python/parse_ints.py b/test/python/parse_ints.py new file mode 100644 index 0000000..98214d1 --- /dev/null +++ b/test/python/parse_ints.py @@ -0,0 +1,21 @@ +import json +import sys + +json_data = sys.argv[1] +data_list = json.loads(json_data) +output_values = [] + +for item in data_list: + text = item["input"] + base = int(item["base"]) + + try: + value = int(text, base=base) + except Exception: + value = "Nil" + + output_values.append(str(value)) + +json_output = json.dumps(output_values) + +print(json_output, end="") diff --git a/test/python/python_parse.gleam b/test/python/python_parse.gleam index 17769b9..d371d3e 100644 --- a/test/python/python_parse.gleam +++ b/test/python/python_parse.gleam @@ -1,20 +1,24 @@ -import gleam/int -import gleam/list -import gleam/option.{type Option, None, Some} import gleam/result import shellout -pub fn to_float(text text: String) -> Result(String, Nil) { - text |> parse(program_name: "parse_float.py", base: None) +// TODO: Change function name, input name +// TODO: Make these take lists of test data, do conversion into json string here, return list of results +pub fn to_floats( + input_json_string input_json_string: String, +) -> Result(String, Nil) { + input_json_string |> parse(program_name: "parse_floats.py") } -pub fn to_int(text text: String, base base: Int) -> Result(String, Nil) { - text |> parse(program_name: "parse_int.py", base: Some(base)) +// TODO: Change function name, input name +pub fn to_ints( + input_json_string input_json_string: String, +) -> Result(String, Nil) { + input_json_string |> parse(program_name: "parse_ints.py") } +// TODO: Change function name, input name fn parse( - text text: String, - base base: Option(Int), + input_json_string input_json_string: String, program_name program_name: String, ) -> Result(String, Nil) { let arguments = [ @@ -23,12 +27,9 @@ fn parse( "3.13", "python", "./test/python/" <> program_name, - text, + input_json_string, ] - let arguments = case base { - Some(base) -> arguments |> list.append([base |> int.to_string]) - None -> arguments - } + shellout.command(run: "uv", with: arguments, in: ".", opt: []) |> result.replace_error(Nil) } diff --git a/test/python_parse_test.gleam b/test/python_parse_test.gleam index 6d85413..1daeca9 100644 --- a/test/python_parse_test.gleam +++ b/test/python_parse_test.gleam @@ -4,7 +4,6 @@ import gleam/int import gleam/list import helpers import parse_error -import python/python_parse import startest.{describe, it} import startest/expect @@ -12,14 +11,16 @@ pub fn check_against_python_tests() { describe("check_against_python_tests", [ describe( "python_float_test", - data.float_data() + data.python_processed_float_data() |> list.map(fn(data) { - let input = data.input + let input = { data.0 }.input + let expected_program_output = { data.0 }.expected_program_output + let expected_python_output = { data.0 }.expected_python_output + let actual_python_output = data.1 + let input_printable_text = input |> helpers.to_printable_text - let output = data.output - let python_output = data.python_output - let message = case output, python_output { + let message = case expected_program_output, expected_python_output { Ok(_), Ok(python_output) -> { "should_parse: \"" <> input_printable_text @@ -50,27 +51,28 @@ pub fn check_against_python_tests() { use <- it(message) - input - |> python_parse.to_float - |> expect.to_equal(python_output) + expected_python_output + |> expect.to_equal(actual_python_output) }), ), describe( "python_int_test", - data.integer_data() + data.python_processed_integer_data() |> list.map(fn(data) { - let input = data.input + let input = { data.0 }.input + let base = { data.0 }.base + let expected_program_output = { data.0 }.expected_program_output + let expected_python_output = { data.0 }.expected_python_output + let actual_python_output = data.1 + let input_printable_text = input |> helpers.to_printable_text - let output = data.output - let python_output = data.python_output - let base = data.base let base_text = case base { 10 -> "" _ -> "(base: " <> base |> int.to_string <> ")" } - let message = case output, python_output { + let message = case expected_program_output, expected_python_output { Ok(_), Ok(python_output) -> { "should_parse: \"" <> input_printable_text @@ -105,9 +107,8 @@ pub fn check_against_python_tests() { use <- it(message) - input - |> python_parse.to_int(base: base) - |> expect.to_equal(python_output) + expected_python_output + |> expect.to_equal(actual_python_output) }), ), ]) diff --git a/test/test_data.gleam b/test/test_data.gleam index 1e96d60..978e08a 100644 --- a/test/test_data.gleam +++ b/test/test_data.gleam @@ -3,8 +3,8 @@ import parse_error.{type ParseError} pub type FloatTestData { FloatTestData( input: String, - output: Result(Float, ParseError), - python_output: Result(String, Nil), + expected_program_output: Result(Float, ParseError), + expected_python_output: Result(String, Nil), ) } @@ -12,7 +12,7 @@ pub type IntegerTestData { IntegerTestData( input: String, base: Int, - output: Result(Int, ParseError), - python_output: Result(String, Nil), + expected_program_output: Result(Int, ParseError), + expected_python_output: Result(String, Nil), ) } diff --git a/test/to_float_parse_test.gleam b/test/to_float_parse_test.gleam index dd67da2..657d470 100644 --- a/test/to_float_parse_test.gleam +++ b/test/to_float_parse_test.gleam @@ -14,9 +14,9 @@ pub fn to_float_tests() { |> list.map(fn(data) { let input = data.input let input_printable_text = input |> helpers.to_printable_text - let output = data.output + let expected_program_output = data.expected_program_output - let message = case output { + let message = case expected_program_output { Ok(output) -> { "should_parse: \"" <> input_printable_text @@ -37,7 +37,7 @@ pub fn to_float_tests() { input |> lenient_parse.to_float - |> expect.to_equal(output) + |> expect.to_equal(expected_program_output) }), ) } diff --git a/test/to_int_parse_test.gleam b/test/to_int_parse_test.gleam index 3825f9a..1ee18f1 100644 --- a/test/to_int_parse_test.gleam +++ b/test/to_int_parse_test.gleam @@ -14,7 +14,7 @@ pub fn to_int_tests() { |> list.map(fn(data) { let input = data.input let input_printable_text = input |> helpers.to_printable_text - let output = data.output + let expected_program_output = data.expected_program_output let base = data.base let base_text = case base { @@ -22,7 +22,7 @@ pub fn to_int_tests() { _ -> "(base: " <> base |> int.to_string <> ")" } - let message = case output { + let message = case expected_program_output { Ok(output) -> { "should_parse: \"" <> input_printable_text @@ -45,7 +45,7 @@ pub fn to_int_tests() { input |> lenient_parse.to_int_with_base(base: base) - |> expect.to_equal(output) + |> expect.to_equal(expected_program_output) }), ) } From 7a5d28525ff985a511ec09aa0b41b20db4e9b137 Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Sun, 10 Nov 2024 14:16:48 -0500 Subject: [PATCH 2/5] WIP --- test/data.gleam | 1 - 1 file changed, 1 deletion(-) diff --git a/test/data.gleam b/test/data.gleam index 9614dd7..27a53cb 100644 --- a/test/data.gleam +++ b/test/data.gleam @@ -73,4 +73,3 @@ pub fn python_processed_integer_data() { integer_data |> list.zip(processed_values) } -// TODO - test python parsing directly From 505a838b51d4f6ce9acfd3ff1c4aed32a7d8aded Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Sun, 10 Nov 2024 14:50:34 -0500 Subject: [PATCH 3/5] WIP --- test/data.gleam | 62 +++++----------------------------- test/python/python_parse.gleam | 51 +++++++++++++++++++++------- test/to_float_parse_test.gleam | 2 +- test/to_int_parse_test.gleam | 2 +- 4 files changed, 49 insertions(+), 68 deletions(-) diff --git a/test/data.gleam b/test/data.gleam index 27a53cb..20642ed 100644 --- a/test/data.gleam +++ b/test/data.gleam @@ -2,74 +2,28 @@ import data/float/invalid_float_data import data/float/valid_float_data import data/integer/invalid_integer_data import data/integer/valid_integer_data -import gleam/dynamic -import gleam/int -import gleam/json import gleam/list import python/python_parse import test_data.{type FloatTestData, type IntegerTestData} -pub fn float_data() -> List(FloatTestData) { +pub fn float_test_data() -> List(FloatTestData) { [valid_float_data.data(), invalid_float_data.data()] |> list.flatten } -pub fn integer_data() -> List(IntegerTestData) { +pub fn integer_test_data() -> List(IntegerTestData) { [valid_integer_data.data(), invalid_integer_data.data()] |> list.flatten } pub fn python_processed_float_data() { - let integer_data = float_data() - let input_json_string = - integer_data - |> json.array(fn(data) { - json.object([#("input", json.string(data.input))]) - }) - |> json.to_string - - let assert Ok(output_json_string) = python_parse.to_floats(input_json_string) - - let assert Ok(processed_strings) = - json.decode(output_json_string, dynamic.list(of: dynamic.string)) - - let processed_values = - processed_strings - |> list.map(fn(value) { - case value { - "Nil" -> Error(Nil) - _ -> Ok(value) - } - }) - - integer_data |> list.zip(processed_values) + let float_test_data = float_test_data() + let processed_values = python_parse.to_floats(float_test_data) + float_test_data |> list.zip(processed_values) } pub fn python_processed_integer_data() { - let integer_data = integer_data() - let input_json_string = - integer_data - |> json.array(fn(data) { - json.object([ - #("input", json.string(data.input)), - #("base", json.string(data.base |> int.to_string)), - ]) - }) - |> json.to_string - - let assert Ok(output_json_string) = python_parse.to_ints(input_json_string) - - let assert Ok(processed_strings) = - json.decode(output_json_string, dynamic.list(of: dynamic.string)) - - let processed_values = - processed_strings - |> list.map(fn(value) { - case value { - "Nil" -> Error(Nil) - _ -> Ok(value) - } - }) - - integer_data |> list.zip(processed_values) + let integer_test_data = integer_test_data() + let processed_values = python_parse.to_ints(integer_test_data) + integer_test_data |> list.zip(processed_values) } diff --git a/test/python/python_parse.gleam b/test/python/python_parse.gleam index d371d3e..f40c1cd 100644 --- a/test/python/python_parse.gleam +++ b/test/python/python_parse.gleam @@ -1,26 +1,42 @@ -import gleam/result +import gleam/dynamic +import gleam/json +import gleam/list import shellout +import test_data.{type FloatTestData, type IntegerTestData} -// TODO: Change function name, input name -// TODO: Make these take lists of test data, do conversion into json string here, return list of results pub fn to_floats( - input_json_string input_json_string: String, -) -> Result(String, Nil) { + float_test_data float_test_data: List(FloatTestData), +) -> List(Result(String, Nil)) { + let input_json_string = + float_test_data + |> json.array(fn(data) { + json.object([#("input", json.string(data.input))]) + }) + |> json.to_string + input_json_string |> parse(program_name: "parse_floats.py") } -// TODO: Change function name, input name pub fn to_ints( - input_json_string input_json_string: String, -) -> Result(String, Nil) { + integer_test_data integer_test_data: List(IntegerTestData), +) -> List(Result(String, Nil)) { + let input_json_string = + integer_test_data + |> json.array(fn(data) { + json.object([ + #("input", json.string(data.input)), + #("base", json.int(data.base)), + ]) + }) + |> json.to_string + input_json_string |> parse(program_name: "parse_ints.py") } -// TODO: Change function name, input name fn parse( input_json_string input_json_string: String, program_name program_name: String, -) -> Result(String, Nil) { +) -> List(Result(String, Nil)) { let arguments = [ "run", "-p", @@ -30,6 +46,17 @@ fn parse( input_json_string, ] - shellout.command(run: "uv", with: arguments, in: ".", opt: []) - |> result.replace_error(Nil) + let assert Ok(output_json_string) = + shellout.command(run: "uv", with: arguments, in: ".", opt: []) + + let assert Ok(processed_strings) = + json.decode(output_json_string, dynamic.list(of: dynamic.string)) + + processed_strings + |> list.map(fn(value) { + case value { + "Nil" -> Error(Nil) + _ -> Ok(value) + } + }) } diff --git a/test/to_float_parse_test.gleam b/test/to_float_parse_test.gleam index 657d470..168fa42 100644 --- a/test/to_float_parse_test.gleam +++ b/test/to_float_parse_test.gleam @@ -10,7 +10,7 @@ import startest/expect pub fn to_float_tests() { describe( "float_test", - data.float_data() + data.float_test_data() |> list.map(fn(data) { let input = data.input let input_printable_text = input |> helpers.to_printable_text diff --git a/test/to_int_parse_test.gleam b/test/to_int_parse_test.gleam index 1ee18f1..6405666 100644 --- a/test/to_int_parse_test.gleam +++ b/test/to_int_parse_test.gleam @@ -10,7 +10,7 @@ import startest/expect pub fn to_int_tests() { describe( "int_test", - data.integer_data() + data.integer_test_data() |> list.map(fn(data) { let input = data.input let input_printable_text = input |> helpers.to_printable_text From 43beb122a294bec8974e382b7beeb7ea525a6a2a Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Sun, 10 Nov 2024 14:51:02 -0500 Subject: [PATCH 4/5] WIP --- test/python/python_parse.gleam | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/python/python_parse.gleam b/test/python/python_parse.gleam index f40c1cd..2252882 100644 --- a/test/python/python_parse.gleam +++ b/test/python/python_parse.gleam @@ -9,8 +9,8 @@ pub fn to_floats( ) -> List(Result(String, Nil)) { let input_json_string = float_test_data - |> json.array(fn(data) { - json.object([#("input", json.string(data.input))]) + |> json.array(fn(float_data) { + json.object([#("input", json.string(float_data.input))]) }) |> json.to_string @@ -22,10 +22,10 @@ pub fn to_ints( ) -> List(Result(String, Nil)) { let input_json_string = integer_test_data - |> json.array(fn(data) { + |> json.array(fn(integer_data) { json.object([ - #("input", json.string(data.input)), - #("base", json.int(data.base)), + #("input", json.string(integer_data.input)), + #("base", json.int(integer_data.base)), ]) }) |> json.to_string From 200e132cc44c9fdf699304840ce3f5105648356d Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Sun, 10 Nov 2024 14:56:27 -0500 Subject: [PATCH 5/5] WIP --- test/python/python_parse.gleam | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/test/python/python_parse.gleam b/test/python/python_parse.gleam index 2252882..3a6ab28 100644 --- a/test/python/python_parse.gleam +++ b/test/python/python_parse.gleam @@ -7,30 +7,26 @@ import test_data.{type FloatTestData, type IntegerTestData} pub fn to_floats( float_test_data float_test_data: List(FloatTestData), ) -> List(Result(String, Nil)) { - let input_json_string = - float_test_data - |> json.array(fn(float_data) { - json.object([#("input", json.string(float_data.input))]) - }) - |> json.to_string - - input_json_string |> parse(program_name: "parse_floats.py") + float_test_data + |> json.array(fn(float_data) { + json.object([#("input", json.string(float_data.input))]) + }) + |> json.to_string + |> parse(program_name: "parse_floats.py") } pub fn to_ints( integer_test_data integer_test_data: List(IntegerTestData), ) -> List(Result(String, Nil)) { - let input_json_string = - integer_test_data - |> json.array(fn(integer_data) { - json.object([ - #("input", json.string(integer_data.input)), - #("base", json.int(integer_data.base)), - ]) - }) - |> json.to_string - - input_json_string |> parse(program_name: "parse_ints.py") + integer_test_data + |> json.array(fn(integer_data) { + json.object([ + #("input", json.string(integer_data.input)), + #("base", json.int(integer_data.base)), + ]) + }) + |> json.to_string + |> parse(program_name: "parse_ints.py") } fn parse(