mod test_helpers;
use crate::test_helpers::*;
use slicec::diagnostics::{Diagnostic, Error};
use slicec::grammar::{attributes, AttributeFunctions, Enumerator, Struct};
use slicec::slice_file::Span;
#[test]
fn parse_empty_string() {
let slice = "";
assert_parses(slice);
}
#[test]
fn parse_string_containing_only_whitespace() {
let slice = " ";
assert_parses(slice);
}
#[test]
fn parse_ideographic_space() {
let slice = " ";
assert_parses(slice);
}
#[test]
fn string_literals_cannot_contain_newlines() {
let slice = r#"
[foo("attribute
test")]
module Test
"#;
let diagnostics = parse_for_diagnostics(slice);
let span = Span::new((2, 14).into(), (2, 24).into(), "string-0");
let expected = Diagnostic::new(Error::Syntax {
message: "unterminated string literal".to_owned(),
})
.set_span(&span);
check_diagnostics(diagnostics, [expected]);
}
#[test]
fn string_literals_support_character_escaping() {
let slice = r#"
module Test
[deprecated("This is a backslash\"\\\"\n.")]
struct Foo {}
"#;
let ast = parse_for_ast(slice);
let struct_def = ast.find_element::<Struct>("Test::Foo").unwrap();
let deprecated = struct_def.find_attribute::<attributes::Deprecated>().unwrap();
assert_eq!(deprecated.reason, Some("This is a backslash\"\\\"n.".to_owned()))
}
#[test]
fn integer_literals_can_contain_underscores() {
let slice = "
module Test
enum Foo : int32 {
A = 17_000_000
}
";
let ast = parse_for_ast(slice);
let enumerator = ast.find_element::<Enumerator>("Test::Foo::A").unwrap();
assert_eq!(enumerator.value(), 17_000_000);
}
#[test]
fn files_are_parsed_independently() {
let slice1 = "
module Not-Valid
";
let slice2 = "
module Also-Bogus
";
let diagnostics = parse_multiple_for_diagnostics(&[slice1, slice2]);
let expected_message = "expected one of '::', '[', 'class', 'compact', 'custom', 'doc comment', 'enum', 'exception', 'interface', 'struct', 'typealias', or 'unchecked', but found '-'";
let expected = [
Diagnostic::new(Error::Syntax {
message: expected_message.to_owned(),
}),
Diagnostic::new(Error::Syntax {
message: expected_message.to_owned(),
}),
];
check_diagnostics(diagnostics, expected);
}