From b3ce39fb656914de2aad912f290bf78e26b382a9 Mon Sep 17 00:00:00 2001 From: Stiopa Koltsov Date: Thu, 10 Oct 2024 19:36:18 -0700 Subject: [PATCH] Convert record tests to golden Summary: Need to add a few more. Reviewed By: JakobDegen Differential Revision: D64214360 fbshipit-source-id: 376156fe1e4076d8f0e7b2709465224ca5123856 --- starlark/src/assert/assert.rs | 9 +++++++ .../src/values/types/record/record_type.rs | 12 ++++----- .../record/record_type/anon_record.golden | 21 +++++++++++++++ .../record_type_as_type_compile_time.golden | 25 +++++++++++++++++ .../record_type_as_type_runtime.golden | 27 +++++++++++++++++++ .../src/values/types/record/ty_record_type.rs | 14 +++++----- .../ty_record_type/fail_compile_time.golden | 24 +++++++++++++++++ .../ty_record_type/fail_runtime_time.golden | 26 ++++++++++++++++++ .../typecheck_field_fail.golden | 21 +++++++++++++++ 9 files changed, 166 insertions(+), 13 deletions(-) create mode 100644 starlark/src/values/types/record/record_type/anon_record.golden create mode 100644 starlark/src/values/types/record/record_type/record_type_as_type_compile_time.golden create mode 100644 starlark/src/values/types/record/record_type/record_type_as_type_runtime.golden create mode 100644 starlark/src/values/types/record/ty_record_type/fail_compile_time.golden create mode 100644 starlark/src/values/types/record/ty_record_type/fail_runtime_time.golden create mode 100644 starlark/src/values/types/record/ty_record_type/typecheck_field_fail.golden diff --git a/starlark/src/assert/assert.rs b/starlark/src/assert/assert.rs index b88bbf690..dbe85fae8 100644 --- a/starlark/src/assert/assert.rs +++ b/starlark/src/assert/assert.rs @@ -593,6 +593,15 @@ pub fn fail(program: &str, msg: &str) -> crate::Error { Assert::new().fail(program, msg) } +#[cfg(test)] +pub(crate) fn fail_golden(path: &str, program: &str) -> crate::Error { + let program = program.trim(); + let e = fails(program, &[]); + let output = format!("Program:\n\n{program}\n\nError:\n\n{e:?}\n"); + starlark_syntax::golden_test_template::golden_test_template(path, &output); + e +} + #[cfg(test)] pub(crate) fn fail_skip_typecheck(program: &str, msg: &str) -> crate::Error { let mut a = Assert::new(); diff --git a/starlark/src/values/types/record/record_type.rs b/starlark/src/values/types/record/record_type.rs index 2457c9ce0..3a94c1136 100644 --- a/starlark/src/values/types/record/record_type.rs +++ b/starlark/src/values/types/record/record_type.rs @@ -372,7 +372,8 @@ f_pass(RecPass(a = 1, b = 2)) #[test] fn test_record_type_as_type_compile_time() { - assert::fail( + assert::fail_golden( + "src/values/types/record/record_type/record_type_as_type_compile_time.golden", r" RecFailCt1 = record(a = field(int), b = field(int)) RecFailCt2 = record(a = field(int), b = field(int)) @@ -383,13 +384,13 @@ def f_fail_ct(x: RecFailCt1): def test(): f_fail_ct(RecFailCt2(a = 1, b = 2)) ", - "Expected type `RecFailCt1` but got `RecFailCt2`", ); } #[test] fn test_record_type_as_type_runtime() { - assert::fail( + assert::fail_golden( + "src/values/types/record/record_type/record_type_as_type_runtime.golden", r" RecFailRt1 = record(a = field(int), b = field(int)) RecFailRt2 = record(a = field(int), b = field(int)) @@ -399,15 +400,14 @@ def f_fail_rt(x: RecFailRt1): noop(f_fail_rt)(RecFailRt2(a = 1, b = 2)) ", - "Value `record[RecFailRt2](a=1, b=2)` of type `record` does not match the type annotation", ); } #[test] fn test_anon_record() { - assert::fail( + assert::fail_golden( + "src/values/types/record/record_type/anon_record.golden", "record(a = field(int))(a = 1)", - "not assigned to a global variable", ); } } diff --git a/starlark/src/values/types/record/record_type/anon_record.golden b/starlark/src/values/types/record/record_type/anon_record.golden new file mode 100644 index 000000000..9b24b5443 --- /dev/null +++ b/starlark/src/values/types/record/record_type/anon_record.golden @@ -0,0 +1,21 @@ +# @generated +# To regenerate, run: +# ``` +# STARLARK_RUST_REGENERATE_GOLDEN_TESTS=1 cargo test -p starlark --lib +# ``` + +Program: + +record(a = field(int))(a = 1) + +Error: + +Traceback (most recent call last): + * assert.bzl:1, in + record(a = field(int))(a = 1) +error: Record instance cannot be created if record type is not assigned to a global variable + --> assert.bzl:1:1 + | +1 | record(a = field(int))(a = 1) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | diff --git a/starlark/src/values/types/record/record_type/record_type_as_type_compile_time.golden b/starlark/src/values/types/record/record_type/record_type_as_type_compile_time.golden new file mode 100644 index 000000000..7abf7c1f0 --- /dev/null +++ b/starlark/src/values/types/record/record_type/record_type_as_type_compile_time.golden @@ -0,0 +1,25 @@ +# @generated +# To regenerate, run: +# ``` +# STARLARK_RUST_REGENERATE_GOLDEN_TESTS=1 cargo test -p starlark --lib +# ``` + +Program: + +RecFailCt1 = record(a = field(int), b = field(int)) +RecFailCt2 = record(a = field(int), b = field(int)) + +def f_fail_ct(x: RecFailCt1): + return x.a + +def test(): + f_fail_ct(RecFailCt2(a = 1, b = 2)) + +Error: + +error: Expected type `RecFailCt1` but got `RecFailCt2` + --> assert.bzl:8:15 + | +8 | f_fail_ct(RecFailCt2(a = 1, b = 2)) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | diff --git a/starlark/src/values/types/record/record_type/record_type_as_type_runtime.golden b/starlark/src/values/types/record/record_type/record_type_as_type_runtime.golden new file mode 100644 index 000000000..16cfa90a5 --- /dev/null +++ b/starlark/src/values/types/record/record_type/record_type_as_type_runtime.golden @@ -0,0 +1,27 @@ +# @generated +# To regenerate, run: +# ``` +# STARLARK_RUST_REGENERATE_GOLDEN_TESTS=1 cargo test -p starlark --lib +# ``` + +Program: + +RecFailRt1 = record(a = field(int), b = field(int)) +RecFailRt2 = record(a = field(int), b = field(int)) + +def f_fail_rt(x: RecFailRt1): + return x.a + +noop(f_fail_rt)(RecFailRt2(a = 1, b = 2)) + +Error: + +Traceback (most recent call last): + * assert.bzl:7, in + noop(f_fail_rt)(RecFailRt2(a = 1, b = 2)) +error: Value `record[RecFailRt2](a=1, b=2)` of type `record` does not match the type annotation `RecFailRt1` for argument `x` + --> assert.bzl:7:1 + | +7 | noop(f_fail_rt)(RecFailRt2(a = 1, b = 2)) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | diff --git a/starlark/src/values/types/record/ty_record_type.rs b/starlark/src/values/types/record/ty_record_type.rs index 7eec03fe2..4401ae3bb 100644 --- a/starlark/src/values/types/record/ty_record_type.rs +++ b/starlark/src/values/types/record/ty_record_type.rs @@ -52,7 +52,8 @@ foo(MyRec(x = 1)) #[test] fn test_fail_compile_time() { - assert::fail( + assert::fail_golden( + "src/values/types/record/ty_record_type/fail_compile_time.golden", r#" MyRec = record(x = int) WrongRec = record(x = int) @@ -62,22 +63,21 @@ def foo(x: MyRec): pass def bar(): foo(WrongRec(x = 1)) "#, - r#"Expected type `MyRec` but got `WrongRec`"#, ); } #[test] fn test_fail_runtime_time() { - assert::fail_skip_typecheck( + assert::fail_golden( + "src/values/types/record/ty_record_type/fail_runtime_time.golden", r#" MyRec = record(x = int) WrongRec = record(x = int) def foo(x: MyRec): pass -foo(WrongRec(x = 1)) +noop(foo)(WrongRec(x = 1)) "#, - r#"Value `record[WrongRec](x=1)` of type `record` does not match the type annotation `MyRec`"#, ); } @@ -111,14 +111,14 @@ assert_eq(f(MyRec(x = 1, y = 2)), 3) #[test] fn test_typecheck_field_fail() { - assert::fail( + assert::fail_golden( + "src/values/types/record/ty_record_type/typecheck_field_fail.golden", r#" MyRec = record(x = int, y = int) def f(rec: MyRec) -> int: return rec.z "#, - r#"The attribute `z` is not available on the type `MyRec`"#, ); } diff --git a/starlark/src/values/types/record/ty_record_type/fail_compile_time.golden b/starlark/src/values/types/record/ty_record_type/fail_compile_time.golden new file mode 100644 index 000000000..046ee08c1 --- /dev/null +++ b/starlark/src/values/types/record/ty_record_type/fail_compile_time.golden @@ -0,0 +1,24 @@ +# @generated +# To regenerate, run: +# ``` +# STARLARK_RUST_REGENERATE_GOLDEN_TESTS=1 cargo test -p starlark --lib +# ``` + +Program: + +MyRec = record(x = int) +WrongRec = record(x = int) + +def foo(x: MyRec): pass + +def bar(): + foo(WrongRec(x = 1)) + +Error: + +error: Expected type `MyRec` but got `WrongRec` + --> assert.bzl:7:9 + | +7 | foo(WrongRec(x = 1)) + | ^^^^^^^^^^^^^^^ + | diff --git a/starlark/src/values/types/record/ty_record_type/fail_runtime_time.golden b/starlark/src/values/types/record/ty_record_type/fail_runtime_time.golden new file mode 100644 index 000000000..9a8ecb2f3 --- /dev/null +++ b/starlark/src/values/types/record/ty_record_type/fail_runtime_time.golden @@ -0,0 +1,26 @@ +# @generated +# To regenerate, run: +# ``` +# STARLARK_RUST_REGENERATE_GOLDEN_TESTS=1 cargo test -p starlark --lib +# ``` + +Program: + +MyRec = record(x = int) +WrongRec = record(x = int) + +def foo(x: MyRec): pass + +noop(foo)(WrongRec(x = 1)) + +Error: + +Traceback (most recent call last): + * assert.bzl:6, in + noop(foo)(WrongRec(x = 1)) +error: Value `record[WrongRec](x=1)` of type `record` does not match the type annotation `MyRec` for argument `x` + --> assert.bzl:6:1 + | +6 | noop(foo)(WrongRec(x = 1)) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | diff --git a/starlark/src/values/types/record/ty_record_type/typecheck_field_fail.golden b/starlark/src/values/types/record/ty_record_type/typecheck_field_fail.golden new file mode 100644 index 000000000..5b7d7b3cf --- /dev/null +++ b/starlark/src/values/types/record/ty_record_type/typecheck_field_fail.golden @@ -0,0 +1,21 @@ +# @generated +# To regenerate, run: +# ``` +# STARLARK_RUST_REGENERATE_GOLDEN_TESTS=1 cargo test -p starlark --lib +# ``` + +Program: + +MyRec = record(x = int, y = int) + +def f(rec: MyRec) -> int: + return rec.z + +Error: + +error: The attribute `z` is not available on the type `MyRec` + --> assert.bzl:4:16 + | +4 | return rec.z + | ^ + |