From e277fb2f7316fef5c20e7c485eeba1f14328d621 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sun, 1 Mar 2020 15:36:44 +0000 Subject: Run tests from repo root as specified in spec --- dhall/src/tests.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'dhall/src/tests.rs') diff --git a/dhall/src/tests.rs b/dhall/src/tests.rs index 482f9ae..3649f8d 100644 --- a/dhall/src/tests.rs +++ b/dhall/src/tests.rs @@ -80,7 +80,7 @@ impl TestFile { match self { TestFile::Source(path) | TestFile::Binary(path) - | TestFile::UI(path) => PathBuf::from(path), + | TestFile::UI(path) => PathBuf::from("dhall").join(path), } } @@ -243,6 +243,11 @@ fn run_test_stringy_error(test: Test) -> std::result::Result<(), String> { fn run_test(test: Test) -> Result<()> { use self::Test::*; + // Setup current directory to the root of the repository. Important for import tests. + env::set_current_dir( + PathBuf::from(env!("CARGO_MANIFEST_DIR")).parent().unwrap(), + )?; + match test { ParserSuccess(expr, expected) => { let expr = expr.parse()?; @@ -302,6 +307,7 @@ fn run_test(test: Test) -> Result<()> { expected.compare(expr)?; } } + Ok(()) } -- cgit v1.3.1 From 24ff14dc98b83ddc12239a0eae4852c9cd87d41f Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sun, 1 Mar 2020 16:37:10 +0000 Subject: Add a lot of import tests --- dhall/build.rs | 16 +++++++++++++++- dhall/src/tests.rs | 2 +- dhall/tests/import/data/cycle.dhall | 1 + dhall/tests/import/data/doesNotTypecheck.dhall | 1 + dhall/tests/import/data/example.txt | 1 + dhall/tests/import/data/fieldOrder/1.dhall | 1 + dhall/tests/import/data/fieldOrder/2.dhall | 1 + dhall/tests/import/data/importBoundary.dhall | 3 +++ dhall/tests/import/data/nested.dhall | 1 + dhall/tests/import/data/referentiallyOpaque.dhall | 18 ++++++++++++++++++ dhall/tests/import/data/simple.dhall | 1 + dhall/tests/import/data/simpleLocation.dhall | 1 + dhall/tests/import/failure/unit/EnvUnset.dhall | 1 + dhall/tests/import/failure/unit/EnvUnsetAsText.dhall | 1 + .../tests/import/success/unit/AlternativeChain1A.dhall | 1 + .../tests/import/success/unit/AlternativeChain1B.dhall | 1 + .../tests/import/success/unit/AlternativeChain2A.dhall | 1 + .../tests/import/success/unit/AlternativeChain2B.dhall | 1 + dhall/tests/import/success/unit/AlternativeEnvA.dhall | 1 + dhall/tests/import/success/unit/AlternativeEnvB.dhall | 1 + .../import/success/unit/AlternativeHashMismatchA.dhall | 1 + .../import/success/unit/AlternativeHashMismatchB.dhall | 1 + .../import/success/unit/AlternativeImportErrorA.dhall | 1 + .../import/success/unit/AlternativeImportErrorB.dhall | 1 + .../success/unit/AlternativeNestedImportErrorA.dhall | 1 + .../success/unit/AlternativeNestedImportErrorB.dhall | 1 + .../import/success/unit/AlternativeNoError1A.dhall | 1 + .../import/success/unit/AlternativeNoError1B.dhall | 1 + .../import/success/unit/AlternativeNoError2A.dhall | 1 + .../import/success/unit/AlternativeNoError2B.dhall | 1 + .../import/success/unit/AlternativeNoError3A.dhall | 1 + .../import/success/unit/AlternativeNoError3B.dhall | 1 + .../import/success/unit/AlternativeParseErrorA.dhall | 1 + .../import/success/unit/AlternativeParseErrorB.dhall | 1 + .../import/success/unit/AlternativeSubExprA.dhall | 1 + .../import/success/unit/AlternativeSubExprB.dhall | 1 + .../import/success/unit/AlternativeTypeErrorA.dhall | 1 + .../import/success/unit/AlternativeTypeErrorB.dhall | 1 + dhall/tests/import/success/unit/AsTextA.dhall | 1 + dhall/tests/import/success/unit/AsTextB.dhall | 3 +++ dhall/tests/import/success/unit/EnvSetA.dhall | 1 + dhall/tests/import/success/unit/EnvSetAsTextA.dhall | 1 + dhall/tests/import/success/unit/EnvSetAsTextB.dhall | 1 + dhall/tests/import/success/unit/EnvSetB.dhall | 1 + dhall/tests/import/success/unit/NormalizeA.dhall | 1 + dhall/tests/import/success/unit/NormalizeB.dhall | 1 + dhall/tests/import/success/unit/SimpleA.dhall | 1 + dhall/tests/import/success/unit/SimpleB.dhall | 1 + dhall/tests/import/success/unit/SimpleRemoteA.dhall | 1 + dhall/tests/import/success/unit/SimpleRemoteB.dhall | 1 + dhall/tests/type-inference/success/CacheImportsA.dhall | 5 +++++ .../success/CacheImportsCanonicalizeA.dhall | 5 +++++ .../success/CacheImportsCanonicalizeB.dhall | 1 + update-tests.sh | 5 +++-- 54 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 dhall/tests/import/data/cycle.dhall create mode 100644 dhall/tests/import/data/doesNotTypecheck.dhall create mode 100644 dhall/tests/import/data/example.txt create mode 100644 dhall/tests/import/data/fieldOrder/1.dhall create mode 100644 dhall/tests/import/data/fieldOrder/2.dhall create mode 100644 dhall/tests/import/data/importBoundary.dhall create mode 100644 dhall/tests/import/data/nested.dhall create mode 100644 dhall/tests/import/data/referentiallyOpaque.dhall create mode 100644 dhall/tests/import/data/simple.dhall create mode 100644 dhall/tests/import/data/simpleLocation.dhall create mode 100644 dhall/tests/import/failure/unit/EnvUnset.dhall create mode 100644 dhall/tests/import/failure/unit/EnvUnsetAsText.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeChain1A.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeChain1B.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeChain2A.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeChain2B.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeEnvA.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeEnvB.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeHashMismatchA.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeHashMismatchB.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeImportErrorA.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeImportErrorB.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeNestedImportErrorA.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeNestedImportErrorB.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeNoError1A.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeNoError1B.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeNoError2A.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeNoError2B.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeNoError3A.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeNoError3B.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeParseErrorA.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeParseErrorB.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeSubExprA.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeSubExprB.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeTypeErrorA.dhall create mode 100644 dhall/tests/import/success/unit/AlternativeTypeErrorB.dhall create mode 100644 dhall/tests/import/success/unit/AsTextA.dhall create mode 100644 dhall/tests/import/success/unit/AsTextB.dhall create mode 100644 dhall/tests/import/success/unit/EnvSetA.dhall create mode 100644 dhall/tests/import/success/unit/EnvSetAsTextA.dhall create mode 100644 dhall/tests/import/success/unit/EnvSetAsTextB.dhall create mode 100644 dhall/tests/import/success/unit/EnvSetB.dhall create mode 100644 dhall/tests/import/success/unit/NormalizeA.dhall create mode 100644 dhall/tests/import/success/unit/NormalizeB.dhall create mode 100644 dhall/tests/import/success/unit/SimpleA.dhall create mode 100644 dhall/tests/import/success/unit/SimpleB.dhall create mode 100644 dhall/tests/import/success/unit/SimpleRemoteA.dhall create mode 100644 dhall/tests/import/success/unit/SimpleRemoteB.dhall create mode 100644 dhall/tests/type-inference/success/CacheImportsCanonicalizeA.dhall create mode 100644 dhall/tests/type-inference/success/CacheImportsCanonicalizeB.dhall (limited to 'dhall/src/tests.rs') diff --git a/dhall/build.rs b/dhall/build.rs index 2c70b89..6165be2 100644 --- a/dhall/build.rs +++ b/dhall/build.rs @@ -259,6 +259,17 @@ fn generate_tests() -> std::io::Result<()> { || path == "headerForwarding" || path == "noHeaderForwarding" || path == "unit/asLocation/Remote" + || path == "unit/AlternativeChain1" + || path == "unit/AlternativeChain2" + || path == "unit/AlternativeEnv" + || path == "unit/AlternativeHashMismatch" + || path == "unit/AlternativeImportError" + || path == "unit/AlternativeNoError3" + || path == "unit/AlternativeSubExpr" + || path == "unit/AsText" + || path == "unit/EnvSet" + || path == "unit/EnvSetAsText" + || path == "unit/SimpleRemote" }), input_type: FileType::Text, output_type: Some(FileType::Text), @@ -276,6 +287,8 @@ fn generate_tests() -> std::io::Result<()> { || path == "missing" || path == "referentiallyInsane" || path == "customHeadersUsingBoundVariable" + || path == "unit/EnvUnset" + || path == "unit/EnvUnsetAsText" }), input_type: FileType::Text, output_type: Some(FileType::UI), @@ -322,8 +335,9 @@ fn generate_tests() -> std::io::Result<()> { // Too slow, but also not all features implemented // For now needs support for hashed imports || path == "prelude" - // TODO: imports + // TODO: remote imports || path == "CacheImports" + || path == "CacheImportsCanonicalize" }), input_type: FileType::Text, output_type: Some(FileType::Text), diff --git a/dhall/src/tests.rs b/dhall/src/tests.rs index 3649f8d..044b185 100644 --- a/dhall/src/tests.rs +++ b/dhall/src/tests.rs @@ -243,7 +243,7 @@ fn run_test_stringy_error(test: Test) -> std::result::Result<(), String> { fn run_test(test: Test) -> Result<()> { use self::Test::*; - // Setup current directory to the root of the repository. Important for import tests. + // Setup current directory to the root of the repository. Important for `as Location` tests. env::set_current_dir( PathBuf::from(env!("CARGO_MANIFEST_DIR")).parent().unwrap(), )?; diff --git a/dhall/tests/import/data/cycle.dhall b/dhall/tests/import/data/cycle.dhall new file mode 100644 index 0000000..c370a8d --- /dev/null +++ b/dhall/tests/import/data/cycle.dhall @@ -0,0 +1 @@ +../failure/cycle.dhall diff --git a/dhall/tests/import/data/doesNotTypecheck.dhall b/dhall/tests/import/data/doesNotTypecheck.dhall new file mode 100644 index 0000000..b748e2d --- /dev/null +++ b/dhall/tests/import/data/doesNotTypecheck.dhall @@ -0,0 +1 @@ +0 0 diff --git a/dhall/tests/import/data/example.txt b/dhall/tests/import/data/example.txt new file mode 100644 index 0000000..af5626b --- /dev/null +++ b/dhall/tests/import/data/example.txt @@ -0,0 +1 @@ +Hello, world! diff --git a/dhall/tests/import/data/fieldOrder/1.dhall b/dhall/tests/import/data/fieldOrder/1.dhall new file mode 100644 index 0000000..797e071 --- /dev/null +++ b/dhall/tests/import/data/fieldOrder/1.dhall @@ -0,0 +1 @@ +{ foo = 1, bar = True } diff --git a/dhall/tests/import/data/fieldOrder/2.dhall b/dhall/tests/import/data/fieldOrder/2.dhall new file mode 100644 index 0000000..c16b568 --- /dev/null +++ b/dhall/tests/import/data/fieldOrder/2.dhall @@ -0,0 +1 @@ +{ bar = True, foo = 1 } diff --git a/dhall/tests/import/data/importBoundary.dhall b/dhall/tests/import/data/importBoundary.dhall new file mode 100644 index 0000000..e6f1074 --- /dev/null +++ b/dhall/tests/import/data/importBoundary.dhall @@ -0,0 +1,3 @@ +-- This file contains a free variable. This should be a type error, even if the variable +-- is in scope in the importing expression +x diff --git a/dhall/tests/import/data/nested.dhall b/dhall/tests/import/data/nested.dhall new file mode 100644 index 0000000..bf88f65 --- /dev/null +++ b/dhall/tests/import/data/nested.dhall @@ -0,0 +1 @@ +{ x = ./simple.dhall sha256:15f52ecf91c94c1baac02d5a4964b2ed8fa401641a2c8a95e8306ec7c1e3b8d2 } diff --git a/dhall/tests/import/data/referentiallyOpaque.dhall b/dhall/tests/import/data/referentiallyOpaque.dhall new file mode 100644 index 0000000..ff33765 --- /dev/null +++ b/dhall/tests/import/data/referentiallyOpaque.dhall @@ -0,0 +1,18 @@ +{- This is a "referentially opaque" import (i.e. an import that is not + globally addressable), which cannot be imported by a "referentially + transparent" import (i.e. an import that is globally addressable). + + This test file is used in a failing test to verify that referentially + transparent imports cannot import referentially opaque imports. In the test + suite this file is actually imported via its GitHub URL (not its local file + path), so it plays the role of the referentially transparent import. Then, + this file attempts to import a referentially opaque import (an environment + variable in this case) to verify that the import fails. + + For this test file we need to select a referentially opaque import that + would succeed if imported on its own, so that a non-compliant implementation + doesn't fail this test for the wrong reason (i.e. due to the import not + being present). We thus use the `DHALL_TEST_VAR` environment variable, that + is expected to be set when running import tests. +-} +env:DHALL_TEST_VAR as Text diff --git a/dhall/tests/import/data/simple.dhall b/dhall/tests/import/data/simple.dhall new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/dhall/tests/import/data/simple.dhall @@ -0,0 +1 @@ +3 diff --git a/dhall/tests/import/data/simpleLocation.dhall b/dhall/tests/import/data/simpleLocation.dhall new file mode 100644 index 0000000..1d3e43b --- /dev/null +++ b/dhall/tests/import/data/simpleLocation.dhall @@ -0,0 +1 @@ +./simple.dhall as Location diff --git a/dhall/tests/import/failure/unit/EnvUnset.dhall b/dhall/tests/import/failure/unit/EnvUnset.dhall new file mode 100644 index 0000000..af77cce --- /dev/null +++ b/dhall/tests/import/failure/unit/EnvUnset.dhall @@ -0,0 +1 @@ +env:DHALL_TEST_UNSET diff --git a/dhall/tests/import/failure/unit/EnvUnsetAsText.dhall b/dhall/tests/import/failure/unit/EnvUnsetAsText.dhall new file mode 100644 index 0000000..9a9db6d --- /dev/null +++ b/dhall/tests/import/failure/unit/EnvUnsetAsText.dhall @@ -0,0 +1 @@ +env:DHALL_TEST_UNSET as Text diff --git a/dhall/tests/import/success/unit/AlternativeChain1A.dhall b/dhall/tests/import/success/unit/AlternativeChain1A.dhall new file mode 100644 index 0000000..15fbf4b --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeChain1A.dhall @@ -0,0 +1 @@ +missing ? missing ? 42 diff --git a/dhall/tests/import/success/unit/AlternativeChain1B.dhall b/dhall/tests/import/success/unit/AlternativeChain1B.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeChain1B.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AlternativeChain2A.dhall b/dhall/tests/import/success/unit/AlternativeChain2A.dhall new file mode 100644 index 0000000..f3ba4b5 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeChain2A.dhall @@ -0,0 +1 @@ +missing ? 42 ? 10 diff --git a/dhall/tests/import/success/unit/AlternativeChain2B.dhall b/dhall/tests/import/success/unit/AlternativeChain2B.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeChain2B.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AlternativeEnvA.dhall b/dhall/tests/import/success/unit/AlternativeEnvA.dhall new file mode 100644 index 0000000..1807534 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeEnvA.dhall @@ -0,0 +1 @@ +env:DHALL_TEST_UNSET ? 42 diff --git a/dhall/tests/import/success/unit/AlternativeEnvB.dhall b/dhall/tests/import/success/unit/AlternativeEnvB.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeEnvB.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AlternativeHashMismatchA.dhall b/dhall/tests/import/success/unit/AlternativeHashMismatchA.dhall new file mode 100644 index 0000000..8f7fb02 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeHashMismatchA.dhall @@ -0,0 +1 @@ +../../data/simple.dhall sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ? 42 diff --git a/dhall/tests/import/success/unit/AlternativeHashMismatchB.dhall b/dhall/tests/import/success/unit/AlternativeHashMismatchB.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeHashMismatchB.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AlternativeImportErrorA.dhall b/dhall/tests/import/success/unit/AlternativeImportErrorA.dhall new file mode 100644 index 0000000..9ecc640 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeImportErrorA.dhall @@ -0,0 +1 @@ +missing ? 42 diff --git a/dhall/tests/import/success/unit/AlternativeImportErrorB.dhall b/dhall/tests/import/success/unit/AlternativeImportErrorB.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeImportErrorB.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AlternativeNestedImportErrorA.dhall b/dhall/tests/import/success/unit/AlternativeNestedImportErrorA.dhall new file mode 100644 index 0000000..d681287 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeNestedImportErrorA.dhall @@ -0,0 +1 @@ +../../failure/missing.dhall ? 42 diff --git a/dhall/tests/import/success/unit/AlternativeNestedImportErrorB.dhall b/dhall/tests/import/success/unit/AlternativeNestedImportErrorB.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeNestedImportErrorB.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AlternativeNoError1A.dhall b/dhall/tests/import/success/unit/AlternativeNoError1A.dhall new file mode 100644 index 0000000..f7c9caf --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeNoError1A.dhall @@ -0,0 +1 @@ +42 ? 10 diff --git a/dhall/tests/import/success/unit/AlternativeNoError1B.dhall b/dhall/tests/import/success/unit/AlternativeNoError1B.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeNoError1B.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AlternativeNoError2A.dhall b/dhall/tests/import/success/unit/AlternativeNoError2A.dhall new file mode 100644 index 0000000..877afd2 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeNoError2A.dhall @@ -0,0 +1 @@ +42 ? missing diff --git a/dhall/tests/import/success/unit/AlternativeNoError2B.dhall b/dhall/tests/import/success/unit/AlternativeNoError2B.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeNoError2B.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AlternativeNoError3A.dhall b/dhall/tests/import/success/unit/AlternativeNoError3A.dhall new file mode 100644 index 0000000..91bcda2 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeNoError3A.dhall @@ -0,0 +1 @@ +env:DHALL_TEST_VAR ? 10 diff --git a/dhall/tests/import/success/unit/AlternativeNoError3B.dhall b/dhall/tests/import/success/unit/AlternativeNoError3B.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeNoError3B.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AlternativeParseErrorA.dhall b/dhall/tests/import/success/unit/AlternativeParseErrorA.dhall new file mode 100644 index 0000000..d427c5d --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeParseErrorA.dhall @@ -0,0 +1 @@ +../../data/example.txt ? 42 diff --git a/dhall/tests/import/success/unit/AlternativeParseErrorB.dhall b/dhall/tests/import/success/unit/AlternativeParseErrorB.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeParseErrorB.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AlternativeSubExprA.dhall b/dhall/tests/import/success/unit/AlternativeSubExprA.dhall new file mode 100644 index 0000000..2c13f4b --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeSubExprA.dhall @@ -0,0 +1 @@ +missing + 10 ? 42 diff --git a/dhall/tests/import/success/unit/AlternativeSubExprB.dhall b/dhall/tests/import/success/unit/AlternativeSubExprB.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeSubExprB.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AlternativeTypeErrorA.dhall b/dhall/tests/import/success/unit/AlternativeTypeErrorA.dhall new file mode 100644 index 0000000..24ae717 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeTypeErrorA.dhall @@ -0,0 +1 @@ +../../data/doesNotTypecheck.dhall ? 42 diff --git a/dhall/tests/import/success/unit/AlternativeTypeErrorB.dhall b/dhall/tests/import/success/unit/AlternativeTypeErrorB.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/AlternativeTypeErrorB.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/AsTextA.dhall b/dhall/tests/import/success/unit/AsTextA.dhall new file mode 100644 index 0000000..9edb0ed --- /dev/null +++ b/dhall/tests/import/success/unit/AsTextA.dhall @@ -0,0 +1 @@ +../../data/example.txt as Text diff --git a/dhall/tests/import/success/unit/AsTextB.dhall b/dhall/tests/import/success/unit/AsTextB.dhall new file mode 100644 index 0000000..1997a89 --- /dev/null +++ b/dhall/tests/import/success/unit/AsTextB.dhall @@ -0,0 +1,3 @@ +'' +Hello, world! +'' diff --git a/dhall/tests/import/success/unit/EnvSetA.dhall b/dhall/tests/import/success/unit/EnvSetA.dhall new file mode 100644 index 0000000..f851f2a --- /dev/null +++ b/dhall/tests/import/success/unit/EnvSetA.dhall @@ -0,0 +1 @@ +env:DHALL_TEST_VAR diff --git a/dhall/tests/import/success/unit/EnvSetAsTextA.dhall b/dhall/tests/import/success/unit/EnvSetAsTextA.dhall new file mode 100644 index 0000000..139b241 --- /dev/null +++ b/dhall/tests/import/success/unit/EnvSetAsTextA.dhall @@ -0,0 +1 @@ +env:DHALL_TEST_VAR as Text diff --git a/dhall/tests/import/success/unit/EnvSetAsTextB.dhall b/dhall/tests/import/success/unit/EnvSetAsTextB.dhall new file mode 100644 index 0000000..192548e --- /dev/null +++ b/dhall/tests/import/success/unit/EnvSetAsTextB.dhall @@ -0,0 +1 @@ +"42" diff --git a/dhall/tests/import/success/unit/EnvSetB.dhall b/dhall/tests/import/success/unit/EnvSetB.dhall new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/dhall/tests/import/success/unit/EnvSetB.dhall @@ -0,0 +1 @@ +42 diff --git a/dhall/tests/import/success/unit/NormalizeA.dhall b/dhall/tests/import/success/unit/NormalizeA.dhall new file mode 100644 index 0000000..2f89d08 --- /dev/null +++ b/dhall/tests/import/success/unit/NormalizeA.dhall @@ -0,0 +1 @@ +../../../../../dhall-lang/tests/normalization/success/unit/OperatorPlusOneAndOneA.dhall diff --git a/dhall/tests/import/success/unit/NormalizeB.dhall b/dhall/tests/import/success/unit/NormalizeB.dhall new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/dhall/tests/import/success/unit/NormalizeB.dhall @@ -0,0 +1 @@ +2 diff --git a/dhall/tests/import/success/unit/SimpleA.dhall b/dhall/tests/import/success/unit/SimpleA.dhall new file mode 100644 index 0000000..035ee8b --- /dev/null +++ b/dhall/tests/import/success/unit/SimpleA.dhall @@ -0,0 +1 @@ +../../data/simple.dhall diff --git a/dhall/tests/import/success/unit/SimpleB.dhall b/dhall/tests/import/success/unit/SimpleB.dhall new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/dhall/tests/import/success/unit/SimpleB.dhall @@ -0,0 +1 @@ +3 diff --git a/dhall/tests/import/success/unit/SimpleRemoteA.dhall b/dhall/tests/import/success/unit/SimpleRemoteA.dhall new file mode 100644 index 0000000..30e0a79 --- /dev/null +++ b/dhall/tests/import/success/unit/SimpleRemoteA.dhall @@ -0,0 +1 @@ +https://raw.githubusercontent.com/dhall-lang/dhall-lang/0b983b92aa2222dc3e292c20550ee37dea3f41df/tests/import/data/simple.dhall diff --git a/dhall/tests/import/success/unit/SimpleRemoteB.dhall b/dhall/tests/import/success/unit/SimpleRemoteB.dhall new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/dhall/tests/import/success/unit/SimpleRemoteB.dhall @@ -0,0 +1 @@ +3 diff --git a/dhall/tests/type-inference/success/CacheImportsA.dhall b/dhall/tests/type-inference/success/CacheImportsA.dhall index 3bd2bc1..7180b19 100644 --- a/dhall/tests/type-inference/success/CacheImportsA.dhall +++ b/dhall/tests/type-inference/success/CacheImportsA.dhall @@ -1 +1,6 @@ +{- + This URL returns (probably) a different result for each request. This test + ensures that import results for a given URL are correctly cached within an + execution of dhall. +-} let _ = assert : https://csrng.net/csrng/csrng.php?min=0&max=1000 as Text === https://csrng.net/csrng/csrng.php?min=0&max=1000 as Text in 0 diff --git a/dhall/tests/type-inference/success/CacheImportsCanonicalizeA.dhall b/dhall/tests/type-inference/success/CacheImportsCanonicalizeA.dhall new file mode 100644 index 0000000..e7f4dcd --- /dev/null +++ b/dhall/tests/type-inference/success/CacheImportsCanonicalizeA.dhall @@ -0,0 +1,5 @@ +{- + This URL returns (probably) a different result for each request. This test + ensures that import locations are canonicalized before being cached. +-} +let _ = assert : https://csrng.net/csrng/csrng.php?min=0&max=1000 as Text === https://csrng.net/csrng/../csrng/csrng.php?min=0&max=1000 as Text in 0 diff --git a/dhall/tests/type-inference/success/CacheImportsCanonicalizeB.dhall b/dhall/tests/type-inference/success/CacheImportsCanonicalizeB.dhall new file mode 100644 index 0000000..2f184a4 --- /dev/null +++ b/dhall/tests/type-inference/success/CacheImportsCanonicalizeB.dhall @@ -0,0 +1 @@ +Natural diff --git a/update-tests.sh b/update-tests.sh index 91ac2ed..6192763 100755 --- a/update-tests.sh +++ b/update-tests.sh @@ -13,6 +13,7 @@ END ) cd "$(dirname "$0")" || exit 1 +export DHALL_TEST_VAR=42 if [ ! -x "$(which dhall)" ] ; then echo "Error: 'dhall' executable not found in PATH" @@ -45,7 +46,7 @@ function semantic-hash_process() { function import_input_file() { echo "$1A.dhall"; } function import_output_file() { echo "$1B.dhall"; } function import_process() { - dhall resolve --file "$1" + dhall --file "$1" } function type-inference_input_file() { echo "$1A.dhall"; } @@ -57,7 +58,7 @@ function type-inference_process() { function normalization_input_file() { echo "$1A.dhall"; } function normalization_output_file() { echo "$1B.dhall"; } function normalization_process() { - dhall resolve --file "$1" | dhall normalize + dhall --file "$1" } function alpha-normalization_input_file() { echo "$1A.dhall"; } -- cgit v1.3.1 From 386f34af802a812c2af8ece2cc427cfb5a7c1fe8 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sun, 1 Mar 2020 17:26:59 +0000 Subject: Implement `missing` and `env:VAR` imports --- dhall/build.rs | 13 ++----------- dhall/src/error/mod.rs | 2 ++ dhall/src/semantics/resolve/resolve.rs | 24 ++++++++++++++++-------- dhall/src/tests.rs | 2 ++ dhall/tests/import/failure/missing.txt | 1 + dhall/tests/import/failure/unit/EnvUnset.txt | 1 + update-tests.sh | 2 +- 7 files changed, 25 insertions(+), 20 deletions(-) create mode 100644 dhall/tests/import/failure/missing.txt create mode 100644 dhall/tests/import/failure/unit/EnvUnset.txt (limited to 'dhall/src/tests.rs') diff --git a/dhall/build.rs b/dhall/build.rs index 6165be2..0ff5acc 100644 --- a/dhall/build.rs +++ b/dhall/build.rs @@ -258,18 +258,11 @@ fn generate_tests() -> std::io::Result<()> { || path == "hashFromCache" || path == "headerForwarding" || path == "noHeaderForwarding" - || path == "unit/asLocation/Remote" - || path == "unit/AlternativeChain1" - || path == "unit/AlternativeChain2" - || path == "unit/AlternativeEnv" || path == "unit/AlternativeHashMismatch" - || path == "unit/AlternativeImportError" - || path == "unit/AlternativeNoError3" - || path == "unit/AlternativeSubExpr" || path == "unit/AsText" - || path == "unit/EnvSet" || path == "unit/EnvSetAsText" || path == "unit/SimpleRemote" + || path == "unit/asLocation/Remote" }), input_type: FileType::Text, output_type: Some(FileType::Text), @@ -283,11 +276,9 @@ fn generate_tests() -> std::io::Result<()> { false || path == "alternativeEnv" || path == "alternativeEnvMissing" + || path == "customHeadersUsingBoundVariable" || path == "hashMismatch" - || path == "missing" || path == "referentiallyInsane" - || path == "customHeadersUsingBoundVariable" - || path == "unit/EnvUnset" || path == "unit/EnvUnsetAsText" }), input_type: FileType::Text, diff --git a/dhall/src/error/mod.rs b/dhall/src/error/mod.rs index 8829d47..5632ea6 100644 --- a/dhall/src/error/mod.rs +++ b/dhall/src/error/mod.rs @@ -26,6 +26,8 @@ pub(crate) enum ErrorKind { #[derive(Debug)] pub(crate) enum ImportError { + Missing, + MissingEnvVar, UnexpectedImport(Import<()>), ImportCycle(ImportStack, Import<()>), } diff --git a/dhall/src/semantics/resolve/resolve.rs b/dhall/src/semantics/resolve/resolve.rs index b27dd2c..bf7aabb 100644 --- a/dhall/src/semantics/resolve/resolve.rs +++ b/dhall/src/semantics/resolve/resolve.rs @@ -1,6 +1,7 @@ use itertools::Itertools; use std::borrow::Cow; -use std::path::{Path, PathBuf}; +use std::env; +use std::path::PathBuf; use crate::error::ErrorBuilder; use crate::error::{Error, ImportError}; @@ -47,8 +48,21 @@ fn resolve_one_import( FilePrefix::Here => cwd.join(path_buf), _ => unimplemented!("{:?}", import), }; - Ok(load_import(env, &path_buf)?) + + let parsed = Parsed::parse_file(&path_buf)?; + let typed = resolve_with_env(env, parsed)?.typecheck()?; + Ok((typed.normalize().to_hir(), typed.ty().clone())) + } + ImportLocation::Env(var_name) => { + let val = match env::var(var_name) { + Ok(val) => val, + Err(_) => Err(ImportError::MissingEnvVar)?, + }; + let parsed = Parsed::parse_str(&val)?; + let typed = resolve_with_env(env, parsed)?.typecheck()?; + Ok((typed.normalize().to_hir(), typed.ty().clone())) } + ImportLocation::Missing => Err(ImportError::Missing.into()), _ => unimplemented!("{:?}", import), } } @@ -122,12 +136,6 @@ fn resolve_one_import( } } -fn load_import(env: &mut ImportEnv, f: &Path) -> Result { - let parsed = Parsed::parse_file(f)?; - let typed = resolve_with_env(env, parsed)?.typecheck()?; - Ok((typed.normalize().to_hir(), typed.ty().clone())) -} - /// Desugar the first level of the expression. fn desugar(expr: &Expr) -> Cow<'_, Expr> { match expr.kind() { diff --git a/dhall/src/tests.rs b/dhall/src/tests.rs index 044b185..369c6cc 100644 --- a/dhall/src/tests.rs +++ b/dhall/src/tests.rs @@ -247,6 +247,8 @@ fn run_test(test: Test) -> Result<()> { env::set_current_dir( PathBuf::from(env!("CARGO_MANIFEST_DIR")).parent().unwrap(), )?; + // Set environment variable for import tests. + env::set_var("DHALL_TEST_VAR", "6 * 7"); match test { ParserSuccess(expr, expected) => { diff --git a/dhall/tests/import/failure/missing.txt b/dhall/tests/import/failure/missing.txt new file mode 100644 index 0000000..4666330 --- /dev/null +++ b/dhall/tests/import/failure/missing.txt @@ -0,0 +1 @@ +Missing diff --git a/dhall/tests/import/failure/unit/EnvUnset.txt b/dhall/tests/import/failure/unit/EnvUnset.txt new file mode 100644 index 0000000..482b68c --- /dev/null +++ b/dhall/tests/import/failure/unit/EnvUnset.txt @@ -0,0 +1 @@ +MissingEnvVar diff --git a/update-tests.sh b/update-tests.sh index 6192763..7be40c4 100755 --- a/update-tests.sh +++ b/update-tests.sh @@ -13,7 +13,7 @@ END ) cd "$(dirname "$0")" || exit 1 -export DHALL_TEST_VAR=42 +export DHALL_TEST_VAR="6 * 7" if [ ! -x "$(which dhall)" ] ; then echo "Error: 'dhall' executable not found in PATH" -- cgit v1.3.1