Test cases for include and import

This commit is contained in:
Martin Haug 2021-05-31 17:19:46 +02:00 committed by Laurenz
parent 00ac68b845
commit 37e0846037
12 changed files with 212 additions and 12 deletions

View File

@ -194,9 +194,9 @@ fn load(cache: &mut FileCache, path: &Path) -> Option<Buffer> {
/// Create a hash that is the same for all paths pointing to the same file.
fn hash(path: &Path) -> Option<FileHash> {
Handle::from_path(path)
.map(|handle| FileHash(fxhash::hash64(&handle)))
.ok()
let file = File::open(path).ok()?;
let handle = Handle::from_file(file).ok()?;
Some(FileHash(fxhash::hash64(&handle)))
}
#[cfg(test)]

View File

@ -563,8 +563,8 @@ fn expr_import(p: &mut Parser) -> Option<Expr> {
let mut expr_import = None;
if let Some(path) = expr(p) {
if p.expect(Token::Using) {
let imports = if p.eat_if(Token::Star) {
let imports = if p.expect(Token::Using) {
if p.eat_if(Token::Star) {
// This is the wildcard scenario.
Imports::Wildcard
} else {
@ -578,14 +578,16 @@ fn expr_import(p: &mut Parser) -> Option<Expr> {
let idents = idents(p, items);
p.end_group();
Imports::Idents(idents)
};
}
} else {
Imports::Idents(vec![])
};
expr_import = Some(Expr::Import(ImportExpr {
span: p.span(start),
imports,
path: Box::new(path),
}));
}
expr_import = Some(Expr::Import(ImportExpr {
span: p.span(start),
imports,
path: Box::new(path),
}));
}
expr_import

BIN
tests/ref/code/import.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
tests/ref/code/include.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -18,6 +18,16 @@
// Error: 2-3 unknown variable
{b}
---
// Double block creates a scope.
{{
import "target.typ" using b
test(b, 1)
}}
// Error: 2-3 unknown variable
{b}
---
// Multiple nested scopes.
{

119
tests/typ/code/import.typ Normal file
View File

@ -0,0 +1,119 @@
// Test import statements.
---
// Test importing semantics.
// A named import.
#import "target.typ" using item
#test(item(1, 2), 3)
// Test that this will be overwritten.
#let value = [foo]
// Import multiple things.
// Error: 28-29 expected expression, found comma
#import "target.typ" using ,fn, value
#fn[Like and Subscribe!]
#value
// Code mode
{
import "target.typ" using b
test(b, 1)
}
#test(b, 1)
// This should not exist yet
// Error: 1-3 unknown variable
#d
// A wildcard import.
#import "target.typ" using *
// It exists now!
#d
---
// Test bad imports.
// Ref: false
// Error: 9-11 file not found
#import "" using name
// Error: 9-20 file not found
#import "lib/0.2.1" using *
// Error: 9-20 file not found
#import "lib@0.2.1" using *
// Some non-text stuff.
// Error: 9-30 file is not valid utf-8
#import "../../res/rhino.png" using *
// Unresolved import.
// Error: 28-40 unresolved import
#import "target.typ" using non_existing
// Cyclic import.
// Error: 9-34 cyclic import
#import "./importable/cycle1.typ" using *
---
// Test syntax.
// Missing file.
// Error: 9-10 expected expression, found star
#import *
// Should output `"target.typ"`.
// Error: 1-7 unexpected keyword `using`
#using "target.typ"
// Should output `target`.
// Error: 3:9-4:8 file not found
// Error: 3:8 expected semicolon or line break
// Error: 2:8 expected keyword `using`
#import "target.typ
using "target
// Should output `@ 0.2.1 using`.
// Error: 2:21 expected semicolon or line break
// Error: 1:21 expected keyword `using`
#import "target.typ" @ 0.2.1 using *
// Error: 3:21 expected keyword `using`
// Error: 2:21 expected semicolon or line break
// Error: 1:22-1:28 unexpected keyword `using`
#import "target.typ" #using *
// Error: 2:21 expected semicolon or line break
// Error: 1:21 expected keyword `using`
#import "target.typ" usinga,b,c
// Error: 27 expected import items
#import "target.typ" using
// Error: 2:28-2:29 expected expression, found assignment operator
// Error: 1:29 expected import items
#import "target.typ" using =
// Allow the trailing comma.
#import "target.typ" using a, c,
// An additional trailing comma.
// Error: 36-37 expected expression, found comma
#import "target.typ" using a, b, c,,
// Star in the list.
// Error: 2:31-2:32 expected expression, found star
// Error: 32-33 expected expression, found comma
#import "target.typ" using a, *, b
// Stop at semicolon.
#import "target.typ" using a, c;Hi
// Who needs whitespace anyways?
#import "target.typ"using *
#import"target.typ"using*
#import "target.typ"using *

View File

@ -0,0 +1,9 @@
// Ref: false
#let name = "Klaus"
== Chapter 1
#name stood in a field of wheat. There was nothing of particular interest about
the field #name just casually surveyed for any paths on which the corn would not
totally ruin his semi-new outdorsy jacket but then again, most of us spend
considerable time in non-descript environments.

View File

@ -0,0 +1,11 @@
// Ref: false
#let name = "Klaus"
== Chapter 2
Their motivations, however, were pretty descript, so to speak. #name had not yet
conceptualized their consequences, but that should change pretty quickly. #name
approached the center of the field and picked up a 4-foot long disk made from
what could only be cow manure. The hair on the back of #name' neck bristled as
he stared at the unusual sight. After studying the object for a while, he
promptly popped the question, "How much?"

View File

@ -0,0 +1,7 @@
// Ref: false
// Error: 9-21 cyclic import
#import "cycle2.typ" using *
#let inaccessible = "wow"
This is the first element of an import cycle.

View File

@ -0,0 +1,7 @@
// Ref: false
// Error: 9-21 cyclic import
#import "cycle1.typ" using *
#let val = "much cycle"
This is the second element of an import cycle.

View File

@ -0,0 +1,23 @@
// Test include statements.
---
= Document
// Include a file
#include "importable/chap1.typ"
// The variables of the file should not appear in this scope.
// Error: 1-6 unknown variable
#name
// Expression as a file name.
#let chap2 = include "import" + "able/chap" + "2.typ"
_ -- Intermission -- _
#chap2
{
// Expressions, code mode.
// Error: 21-43 file not found
let x = include "importable/chap3.typ"
}

12
tests/typ/code/target.typ Normal file
View File

@ -0,0 +1,12 @@
// A file to import in import / include tests.
// Ref: false
#let a
#let b = 1
#let c = 2
#let d = 3
#let value = [hi]
#let item(a, b) = a + b
#let fn(body) = rect(fill: conifer, pad(5pt, body))
Some _includable_ text.