use crate::test_helpers::*;
use slicec::diagnostics::{Diagnostic, Error};
use slicec::grammar::*;
use test_case::test_case;
#[test]
fn can_contain_fields() {
let slice = "
mode = Slice1
module Test
class C {
i: int32
s: string
b: bool
}
";
let ast = parse_for_ast(slice);
let fields = ast.find_element::<Class>("Test::C").unwrap().fields();
assert_eq!(fields.len(), 3);
assert!(matches!(fields[0].identifier(), "i"));
assert!(matches!(fields[1].identifier(), "s"));
assert!(matches!(fields[2].identifier(), "b"));
assert!(matches!(
fields[0].data_type.concrete_type(),
Types::Primitive(Primitive::Int32),
));
assert!(matches!(
fields[1].data_type.concrete_type(),
Types::Primitive(Primitive::String),
));
assert!(matches!(
fields[2].data_type.concrete_type(),
Types::Primitive(Primitive::Bool),
));
}
#[test_case(
"
class C {
c: C
}
"; "single class circular reference"
)]
#[test_case(
"
class C1 {
c2: C2
}
class C2 {
c1: C1
}
"; "multi class circular reference"
)]
fn cycles_are_allowed(cycle_string: &str) {
let slice = format!(
"
mode = Slice1
module Test
{cycle_string}
"
);
assert_parses(slice);
}
#[test]
fn can_be_empty() {
let slice = "
mode = Slice1
module Test
class C {}
";
let ast = parse_for_ast(slice);
let fields = ast.find_element::<Class>("Test::C").unwrap().fields();
assert_eq!(fields.len(), 0);
}
#[test]
fn cannot_redefine_fields() {
let slice = "
mode = Slice1
module Test
class C {
a: int32
a: string
}
";
let diagnostics = parse_for_diagnostics(slice);
let expected = Diagnostic::new(Error::Redefinition {
identifier: "a".to_string(),
})
.add_note("'a' was previously defined here", None);
check_diagnostics(diagnostics, [expected]);
}