mod container;
mod mode_compatibility;
use crate::test_helpers::*;
use slicec::diagnostics::{Diagnostic, Error};
use slicec::slice_file::Span;
use test_case::test_case;
#[test_case("int8"; "int8")]
#[test_case("uint8"; "uint8")]
#[test_case("int16"; "int16")]
#[test_case("uint16"; "uint16")]
#[test_case("int32"; "int32")]
#[test_case("uint32"; "uint32")]
#[test_case("varint32"; "varint32")]
#[test_case("varuint32"; "varuint32")]
#[test_case("int64"; "int64")]
#[test_case("uint64"; "uint64")]
#[test_case("varint62"; "varint62")]
#[test_case("varuint62"; "varuint62")]
fn supported_numeric_underlying_types_succeed(valid_type: &str) {
let slice = &format!(
"
module Test
unchecked enum E : {valid_type} {{}}
"
);
assert_parses(slice);
}
#[test_case("string"; "string")]
#[test_case("float32"; "float32")]
#[test_case("float64"; "float64")]
fn invalid_underlying_type(underlying_type: &str) {
let slice = format!(
"
module Test
enum E : {underlying_type} {{
A
}}
"
);
let diagnostics = parse_for_diagnostics(slice);
let expected = Diagnostic::new(Error::EnumUnderlyingTypeNotSupported {
enum_identifier: "E".to_owned(),
kind: Some(underlying_type.to_owned()),
});
check_diagnostics(diagnostics, [expected]);
}
#[test]
fn optional_underlying_types_fail() {
let slice = "
module Test
enum E : int32? {
A = 1
}
";
let diagnostics = parse_for_diagnostics(slice);
let expected = Diagnostic::new(Error::CannotUseOptionalUnderlyingType {
enum_identifier: "E".to_owned(),
});
check_diagnostics(diagnostics, [expected]);
}
#[test]
fn enums_can_be_unchecked() {
let slice = "
module Test
unchecked enum E { A }
";
assert_parses(slice);
}
#[test]
fn enums_can_be_compact() {
let slice = "
module Test
compact enum E { A }
";
assert_parses(slice);
}
#[test]
fn compact_enums_cannot_have_underlying_types() {
let slice = "
module Test
compact enum E: uint8 { A }
";
let diagnostics = parse_for_diagnostics(slice);
let expected = Diagnostic::new(Error::CannotBeCompact {
kind: "enum",
identifier: "E".to_owned(),
})
.set_span(&Span::new((4, 9).into(), (4, 23).into(), "string-0"))
.add_note(
"compact enums cannot also have underlying types; try removing either the 'compact' modifier, or the underlying type",
Some(&Span::new((4, 25).into(), (4, 30).into(), "string-0")),
);
check_diagnostics(diagnostics, [expected]);
}
#[test]
fn compact_enums_cannot_be_unchecked() {
let slice = "
module Test
compact unchecked enum E { A }
";
let diagnostics = parse_for_diagnostics(slice);
let expected = Diagnostic::new(Error::CannotBeCompact {
kind: "enum",
identifier: "E".to_owned(),
})
.set_span(&Span::new((4, 9).into(), (4, 33).into(), "string-0"))
.add_note(
"An enum cannot be both unchecked and compact - try removing the 'compact' modifier",
None,
);
check_diagnostics(diagnostics, [expected]);
}