Skip to content

Commit cbf40b8

Browse files
test(naga): cover diagnostic(…); parsing
1 parent 88a8147 commit cbf40b8

2 files changed

Lines changed: 82 additions & 0 deletions

File tree

naga/src/diagnostic_filter.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use serde::Serialize;
2222
#[cfg_attr(feature = "serialize", derive(Serialize))]
2323
#[cfg_attr(feature = "deserialize", derive(Deserialize))]
2424
#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
25+
#[cfg_attr(test, derive(strum::EnumIter))]
2526
pub enum Severity {
2627
Off,
2728
Info,
@@ -30,6 +31,17 @@ pub enum Severity {
3031
}
3132

3233
impl Severity {
34+
/// Maps this [`Severity`] into the sentinel word associated with it in WGSL.
35+
#[cfg(test)]
36+
pub const fn to_wgsl_ident(self) -> &'static str {
37+
match self {
38+
Self::Error => Self::ERROR,
39+
Self::Warning => Self::WARNING,
40+
Self::Info => Self::INFO,
41+
Self::Off => Self::OFF,
42+
}
43+
}
44+
3345
/// Checks whether this severity is [`Self::Error`].
3446
///
3547
/// Naga does not yet support diagnostic items at lesser severities than
@@ -74,6 +86,7 @@ pub enum FilterableTriggeringRule {
7486
#[cfg_attr(feature = "serialize", derive(Serialize))]
7587
#[cfg_attr(feature = "deserialize", derive(Deserialize))]
7688
#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
89+
#[cfg_attr(test, derive(strum::EnumIter))]
7790
pub enum StandardFilterableTriggeringRule {
7891
DerivativeUniformity,
7992
}

naga/src/front/wgsl/tests.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,8 +706,77 @@ fn parse_missing_workgroup_size() {
706706
}
707707

708708
mod diagnostic_filter {
709+
use crate::diagnostic_filter::{
710+
FilterableTriggeringRule, Severity, StandardFilterableTriggeringRule,
711+
};
709712
use crate::front::wgsl::assert_parse_err;
710713

714+
use itertools::Itertools as _;
715+
use strum::IntoEnumIterator as _;
716+
717+
#[test]
718+
fn basic() {}
719+
720+
#[test]
721+
fn malformed() {
722+
assert_parse_err("directive;", snapshot);
723+
assert_parse_err("directive(off, asdf;", snapshot);
724+
assert_parse_err("directive();", snapshot);
725+
}
726+
727+
#[test]
728+
fn severities() {}
729+
730+
#[test]
731+
fn invalid_severity() {}
732+
733+
#[test]
734+
fn triggering_rules() {}
735+
736+
#[test]
737+
fn invalid_triggering_rule() {
738+
#[derive(Debug, Clone)]
739+
enum Rule {
740+
Valid(FilterableTriggeringRule),
741+
Invalid,
742+
}
743+
744+
#[derive(Debug, Clone)]
745+
enum Sev {
746+
Valid(Severity),
747+
Invalid,
748+
}
749+
750+
let cases = {
751+
let invalid_sev_cases = StandardFilterableTriggeringRule::iter()
752+
.map(FilterableTriggeringRule::Standard)
753+
.map(Rule::Valid)
754+
.cartesian_product([Sev::Invalid]);
755+
let invalid_rule_cases = [Rule::Invalid]
756+
.into_iter()
757+
.cartesian_product(Severity::iter().map(Sev::Valid));
758+
invalid_sev_cases.chain(invalid_rule_cases)
759+
};
760+
761+
for (rule, severity) in cases {
762+
let rule = match rule {
763+
Rule::Valid(rule) => rule.to_wgsl_ident(),
764+
Rule::Invalid => "totes_invalid_rule",
765+
};
766+
let severity = match severity {
767+
Sev::Valid(severity) => severity.to_wgsl_ident(),
768+
Sev::Invalid => "totes_invalid_severity",
769+
};
770+
let shader = format!("diagnostic({severity},{rule});");
771+
let expected_msg = format!(
772+
"\
773+
"
774+
);
775+
776+
assert_parse_err(&shader, &expected_msg);
777+
}
778+
}
779+
711780
#[test]
712781
fn intended_global_directive() {
713782
let shader = "@diagnostic(off, my.lint);";

0 commit comments

Comments
 (0)