Files
dev/src/xatu/scope_graph_test.rs

77 lines
2.4 KiB
Rust

use googletest::matchers::eq;
use googletest::{expect_that, gtest};
use xatu::{PathStep, Resolution, ResolutionPath, ScopeGraph};
#[gtest]
fn resolves_a_local_declaration() {
let mut graph = ScopeGraph::new();
let scope = graph.root_scope();
let declaration = graph.add_declaration(scope, "value");
let reference = graph.add_reference(scope, "value");
let expected = vec![resolution(declaration, vec![PathStep::Declaration(declaration)])];
expect_that!(graph.resolve(reference), eq(&expected));
}
#[gtest]
fn resolves_a_parent_declaration() {
let mut graph = ScopeGraph::new();
let parent = graph.root_scope();
let declaration = graph.add_declaration(parent, "value");
let child = graph.add_scope(parent);
let reference = graph.add_reference(child, "value");
let expected = vec![resolution(
declaration,
vec![PathStep::Parent, PathStep::Declaration(declaration)],
)];
expect_that!(graph.resolve(reference), eq(&expected));
}
#[gtest]
fn local_declarations_shadow_parent_declarations() {
let mut graph = ScopeGraph::new();
let parent = graph.root_scope();
graph.add_declaration(parent, "value");
let child = graph.add_scope(parent);
let declaration = graph.add_declaration(child, "value");
let reference = graph.add_reference(child, "value");
let expected = vec![resolution(declaration, vec![PathStep::Declaration(declaration)])];
expect_that!(graph.resolve(reference), eq(&expected));
}
#[gtest]
fn preserves_ambiguous_local_declarations() {
let mut graph = ScopeGraph::new();
let scope = graph.root_scope();
let first = graph.add_declaration(scope, "value");
let second = graph.add_declaration(scope, "value");
let reference = graph.add_reference(scope, "value");
let expected = vec![
resolution(first, vec![PathStep::Declaration(first)]),
resolution(second, vec![PathStep::Declaration(second)]),
];
expect_that!(graph.resolve(reference), eq(&expected));
}
#[gtest]
fn leaves_unresolved_references_without_resolutions() {
let mut graph = ScopeGraph::new();
let reference = graph.add_reference(graph.root_scope(), "value");
let expected = Vec::<Resolution>::new();
expect_that!(graph.resolve(reference), eq(&expected));
}
fn resolution(
declaration: xatu::DeclarationId,
steps: Vec<PathStep>,
) -> Resolution {
Resolution {
declaration,
path: ResolutionPath { steps },
}
}