use std::fmt::Write as _;
use crate::{
EngineInputV2, OmenaParserStyleDialect, StyleAnalysisInputV2, StyleDocumentV2,
summarize_omena_query_native_css_evaluator_from_engine_input,
summarize_omena_query_native_css_evaluator_from_source,
summarize_omena_query_scss_evaluator_control_flow_from_engine_input,
summarize_omena_query_scss_evaluator_control_flow_from_source,
summarize_omena_query_scss_evaluator_control_flow_oracle_corpus,
summarize_omena_query_static_lif_exports_from_engine_input,
summarize_omena_query_static_lif_exports_from_source,
summarize_omena_query_static_stylesheet_evaluator_from_engine_input,
summarize_omena_query_static_stylesheet_evaluator_from_source,
summarize_omena_query_static_stylesheet_evaluator_oracle_corpus,
};
use omena_scss_eval::STABLE_NODE_KEY_TYPE_LABEL_V0;
#[test]
fn exposes_scss_control_flow_through_engine_input_boundary() -> Result<(), String> {
let source = "$brand: red;\n@mixin tone($enabled) { @if $enabled { color: $brand; } @else { color: blue; } }\n.button { @include tone(true); }\n";
let input = EngineInputV2 {
version: "scss-control-flow-engine-input-v0".to_string(),
sources: Vec::new(),
styles: vec![StyleAnalysisInputV2 {
file_path: "/tmp/Button.module.scss".to_string(),
source: Some(source.to_string()),
document: StyleDocumentV2 {
selectors: Vec::new(),
},
}],
type_facts: Vec::new(),
};
let summary = summarize_omena_query_scss_evaluator_control_flow_from_engine_input(
&input,
"/tmp/Button.module.scss",
)
.ok_or_else(|| "target style source should be available from EngineInputV2".to_string())?;
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "scss");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert!(summary.flat_css_cfg_built);
assert!(!summary.merged_cross_file_graph);
assert!(summary.control_flow_block_count > 0);
assert!(summary.control_flow_branch_block_count > 0);
assert!(summary.call_return_node_count > 0);
assert!(summary.value_analysis_converged);
assert!(summary.prune_reachability_available);
assert!(summary.prune_reachability_converged);
assert!(summary.prune_reachability_flat_css_cfg_built);
Ok(())
}
#[test]
fn exposes_less_lif_exports_through_query_boundary() {
let source = r#"
@brand: #fff;
@tokens: { primary: @brand; @gap: 2px; };
.button(@gap: 1rem, @rest...) when (@gap > 0) { color: @brand; }
"#;
let summary =
summarize_omena_query_static_lif_exports_from_source(source, OmenaParserStyleDialect::Less);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.static-lif-exports");
assert_eq!(summary.mode, "staticInterfaceOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.source_syntax, "less");
assert!(summary.sif_superset);
assert_eq!(summary.less_variable_names, vec!["@brand"]);
assert_eq!(summary.less_mixin_names, vec![".button"]);
assert_eq!(summary.less_detached_ruleset_names, vec!["@tokens"]);
assert_eq!(summary.less_specific_export_count, 3);
assert_eq!(summary.sif_variable_count, 0);
assert_eq!(
summary.exports.less_variables[0].value_repr.as_deref(),
Some("#fff")
);
assert!(summary.exports.less_mixins[0].guarded);
assert!(summary.exports.less_mixins[0].parameters[1].variadic);
}
#[test]
fn exposes_less_lif_exports_through_engine_input_boundary() -> Result<(), String> {
let source = r#"
@brand: #fff;
@tokens: { primary: @brand; @gap: 2px; };
.button(@gap: 1rem, @rest...) when (@gap > 0) { color: @brand; }
"#;
let input = EngineInputV2 {
version: "static-lif-engine-input-v0".to_string(),
sources: Vec::new(),
styles: vec![StyleAnalysisInputV2 {
file_path: "/tmp/Button.module.less".to_string(),
source: Some(source.to_string()),
document: StyleDocumentV2 {
selectors: Vec::new(),
},
}],
type_facts: Vec::new(),
};
let summary = summarize_omena_query_static_lif_exports_from_engine_input(
&input,
"/tmp/Button.module.less",
)
.ok_or_else(|| "target style source should be available from EngineInputV2".to_string())?;
assert_eq!(summary.product, "omena-query.static-lif-exports");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.source_syntax, "less");
assert!(summary.sif_superset);
assert_eq!(summary.less_variable_names, vec!["@brand"]);
assert_eq!(summary.less_mixin_names, vec![".button"]);
assert_eq!(summary.less_detached_ruleset_names, vec!["@tokens"]);
Ok(())
}
#[test]
fn exposes_static_stylesheet_evaluator_through_engine_input_boundary() -> Result<(), String> {
let source = "@brand: red;\n.button { color: @brand; }\n";
let input = EngineInputV2 {
version: "static-stylesheet-evaluator-engine-input-v0".to_string(),
sources: Vec::new(),
styles: vec![StyleAnalysisInputV2 {
file_path: "/tmp/Button.module.less".to_string(),
source: Some(source.to_string()),
document: StyleDocumentV2 {
selectors: Vec::new(),
},
}],
type_facts: Vec::new(),
};
let summary = summarize_omena_query_static_stylesheet_evaluator_from_engine_input(
&input,
"/tmp/Button.module.less",
)
.ok_or_else(|| "target style source should be available from EngineInputV2".to_string())?;
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.native_edit_output_matches_evaluated_css);
assert!(summary.native_value_reference_count > 0);
assert!(summary.native_resolved_value_count > 0);
assert!(
summary
.native_edit_output
.as_deref()
.is_some_and(|output| output.contains("color: red"))
);
Ok(())
}
#[test]
fn exposes_scss_exports_as_lif_sif_superset_boundary() {
let source = r#"
$brand: #fff !default;
@mixin button($gap: 1rem) { gap: $gap; }
@function double($value) { @return $value * 2; }
%surface { color: $brand; }
@forward "./tokens" as token-* show $token-brand;
"#;
let summary =
summarize_omena_query_static_lif_exports_from_source(source, OmenaParserStyleDialect::Scss);
assert_eq!(summary.product, "omena-query.static-lif-exports");
assert_eq!(summary.dialect, "scss");
assert_eq!(summary.source_syntax, "scss");
assert!(summary.sif_superset);
assert_eq!(summary.less_specific_export_count, 0);
assert_eq!(summary.sif_variable_count, 1);
assert_eq!(summary.sif_mixin_count, 1);
assert_eq!(summary.sif_function_count, 1);
assert_eq!(summary.sif_placeholder_count, 1);
assert_eq!(summary.sif_forward_count, 1);
assert_eq!(summary.exports.sif_exports.variables[0].name, "$brand");
assert!(summary.exports.sif_exports.variables[0].defaulted);
}
#[test]
fn exposes_static_stylesheet_oracle_corpus_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_oracle_corpus();
assert_eq!(summary.schema_version, "0");
assert_eq!(
summary.product,
"omena-query.static-stylesheet-evaluator-oracle-corpus"
);
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert_eq!(summary.fixture_count, 139);
assert_eq!(summary.scss_fixture_count, 48);
assert_eq!(summary.sass_fixture_count, 40);
assert_eq!(summary.less_fixture_count, 51);
assert_eq!(summary.evaluated_fixture_count, summary.fixture_count);
assert_eq!(
summary.legacy_output_retained_as_oracle_count,
summary.evaluated_fixture_count
);
assert_eq!(summary.legacy_output_consumed_until_cutover_count, 0);
assert!(summary.all_legacy_outputs_retained_as_oracle);
assert_eq!(summary.missing_evaluation_count, 0);
assert_eq!(summary.divergence_count, 0);
assert!(summary.native_replacement_count > 0);
assert!(summary.native_replacement_legacy_reflection_count > 0);
assert_eq!(
summary.native_replacement_legacy_reflection_count
+ summary.native_replacement_legacy_unreflected_count,
summary.native_replacement_count
);
assert!(summary.native_edit_count > 0);
assert!(summary.native_value_edit_count > 0);
assert!(summary.native_structural_edit_count > 0);
assert_eq!(
summary.scss_control_flow_prune_reachability_fixture_count,
summary.scss_fixture_count + summary.sass_fixture_count
);
assert_eq!(
summary.scss_control_flow_prune_reachability_flat_css_cfg_built_count,
summary.scss_fixture_count + summary.sass_fixture_count
);
assert!(summary.scss_control_flow_prune_reachability_changed_fixture_count > 0);
assert_eq!(
summary.native_value_edit_count + summary.native_structural_edit_count,
summary.native_edit_count
);
assert_eq!(
summary.native_edit_output_match_count,
summary.evaluated_fixture_count
);
assert!(summary.native_value_reference_count > 0);
assert!(summary.native_resolved_value_count > 0);
assert!(summary.native_raw_value_count > 0);
assert!(summary.native_top_value_count > 0);
assert!(summary.native_cycle_value_count > 0);
assert!(summary.native_fuel_exhausted_value_count > 0);
assert!(summary.native_unresolved_reference_value_count > 0);
assert!(summary.native_unsupported_dynamic_value_count > 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.all_native_edit_outputs_match_evaluated_css);
assert!(summary.native_product_output_corpus_ready);
assert_eq!(
summary.corpus.product,
"omena-scss-eval.static-stylesheet-oracle-corpus"
);
assert!(summary.corpus.native_product_output_corpus_ready);
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-map-list-builtins"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-map-list-builtins"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
for id in [
"sass.static-default-function-arguments",
"sass.static-default-argument-prior-parameter",
"sass.static-named-default-argument-prior-parameter",
"scss.static-default-function-arguments",
"scss.static-default-argument-prior-parameter",
"scss.static-named-default-argument-prior-parameter",
"sass.static-named-function-arguments",
"sass.static-named-argument-default-tail",
"scss.static-named-function-arguments",
"scss.static-named-argument-default-tail",
"sass.static-hyphen-underscore-function-reference",
"sass.static-hyphen-underscore-named-argument",
"scss.static-hyphen-underscore-function-reference",
"scss.static-hyphen-underscore-named-argument",
"sass.static-named-mixin-arguments",
"sass.static-named-mixin-default-tail",
"sass.static-mixin-default-argument-prior-parameter",
"sass.static-named-mixin-default-argument-prior-parameter",
"sass.static-mixin-content-block",
"sass.static-mixin-content-arguments",
"sass.static-mixin-content-expression-arguments",
"sass.static-mixin-content-nested-include",
"sass.static-nested-mixin-include",
"sass.static-hyphen-underscore-mixin-include",
"scss.static-named-mixin-arguments",
"scss.static-named-mixin-default-tail",
"scss.static-mixin-default-argument-prior-parameter",
"scss.static-named-mixin-default-argument-prior-parameter",
"scss.static-mixin-content-block",
"scss.static-mixin-content-arguments",
"scss.static-mixin-content-expression-arguments",
"scss.static-nested-mixin-include",
"scss.static-hyphen-underscore-mixin-include",
] {
assert!(
summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == id
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}),
"missing evaluated default-argument oracle fixture {id}"
);
}
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "less.extended-numeric-builtins"
&& fixture.dialect == "less"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "less.percentage-rounding-builtins"
&& fixture.dialect == "less"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "less.quoted-value-interpolation"
&& fixture.dialect == "less"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "less.escaped-quoted-value-interpolation"
&& fixture.dialect == "less"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "scss.static-for-return")
);
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.descending-static-for-return"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.descending-static-for-return"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-for-expression-bounds"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-for-expression-bounds"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-while-expression-step"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-while-expression-step"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.variable-basic"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-function-return"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 1
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-mixin-include"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-mixin-if"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-mixin-for"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-mixin-each"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-mixin-while"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-mixin-if"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-mixin-for"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-mixin-each"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-mixin-while"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-top-level-if"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.dynamic-top-level-if"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_edit_count == 0
&& fixture.native_raw_value_count > 0
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-top-level-if-variable"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 1
&& fixture.native_replacement_legacy_reflection_count == 1
&& fixture.native_structural_edit_count == 3
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-top-level-if-function"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 1
&& fixture.native_replacement_legacy_reflection_count == 1
&& fixture.native_structural_edit_count == 3
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-top-level-for"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 3
&& fixture.native_replacement_legacy_reflection_count == 3
&& fixture.native_structural_edit_count == 1
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-top-level-each"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 2
&& fixture.native_replacement_legacy_reflection_count == 2
&& fixture.native_structural_edit_count == 1
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-top-level-while"
&& fixture.dialect == "scss"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 3
&& fixture.native_replacement_legacy_reflection_count == 3
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-top-level-for"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 3
&& fixture.native_replacement_legacy_reflection_count == 3
&& fixture.native_structural_edit_count == 1
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-top-level-each"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 2
&& fixture.native_replacement_legacy_reflection_count == 2
&& fixture.native_structural_edit_count == 1
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-top-level-while"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 3
&& fixture.native_replacement_legacy_reflection_count == 3
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-top-level-if"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 0
&& fixture.native_replacement_legacy_reflection_count == 0
&& fixture.native_structural_edit_count == 2
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-top-level-if-variable"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 1
&& fixture.native_replacement_legacy_reflection_count == 1
&& fixture.native_structural_edit_count == 3
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-top-level-if-function"
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 1
&& fixture.native_replacement_legacy_reflection_count == 1
&& fixture.native_structural_edit_count == 3
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}));
for id in [
"sass.static-if-return",
"sass.static-for-return",
"sass.static-while-return",
"sass.static-while-expression-step",
"sass.static-each-return",
"sass.static-each-tuple-function-source-return",
] {
assert!(
summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == id
&& fixture.dialect == "sass"
&& fixture.evaluation_available
&& fixture.native_replacement_count == 1
&& fixture.native_edit_output_matches_evaluated_css
&& fixture.divergence_count == 0
}),
"missing evaluated Sass control-flow oracle fixture {id}"
);
}
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "scss.indirect-recursive-function-return"
&& fixture.native_top_value_count == 1
&& fixture.native_cycle_value_count == 1));
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "scss.dynamic-function-return"
&& fixture.native_top_value_count == 1
&& fixture.native_unsupported_dynamic_value_count == 1)
);
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.unresolved-forward-composite"
&& fixture.native_top_value_count == 1
&& fixture.native_unresolved_reference_value_count == 1
}));
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "scss.recursive-function-return"
&& fixture.native_top_value_count == 1
&& fixture.native_cycle_value_count == 1)
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.fuel-exhausted-variable-chain"
&& fixture.native_top_value_count == 1
&& fixture.native_fuel_exhausted_value_count == 1)
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "scss.dynamic-mixin-local")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "scss.recursive-nested-mixin-include")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.detached-ruleset")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.unknown-detached-ruleset-mixin-call")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.recursive-nested-mixin-call")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.named-mixin-arguments")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.semicolon-named-mixin-arguments")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.variadic-mixin-arguments")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.mixin-accessor")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.unknown-mixin-accessor-member")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.unknown-mixin-accessor-property-member")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.unknown-detached-ruleset-accessor-member")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.namespace-mixin")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.parameterized-namespace-mixin")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.unbound-parameterized-namespace-mixin")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.literal-pattern-mixin")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.unmatched-literal-pattern-mixin")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.dynamic-escaped-string")
);
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "less.future-property-guarded-mixin"
&& fixture.native_structural_edit_count > 0
&& fixture.native_edit_output_matches_evaluated_css
}));
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.important-mixin")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.unknown-mixin-call-suffix")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.default-guarded-mixin")
);
let false_guard_fixture = summary
.corpus
.fixtures
.iter()
.find(|fixture| fixture.id == "less.false-guarded-mixin");
assert!(false_guard_fixture.is_some_and(|fixture| {
fixture.native_replacement_count == 0
&& fixture.native_structural_edit_count > 0
&& fixture.native_edit_output_matches_evaluated_css
}));
let false_type_predicate_guard_fixture = summary
.corpus
.fixtures
.iter()
.find(|fixture| fixture.id == "less.false-type-predicate-guarded-mixin");
assert!(false_type_predicate_guard_fixture.is_some_and(|fixture| {
fixture.native_replacement_count == 0
&& fixture.native_structural_edit_count > 0
&& fixture.native_edit_output_matches_evaluated_css
}));
let false_guard_namespace_fixture = summary
.corpus
.fixtures
.iter()
.find(|fixture| fixture.id == "less.false-guarded-namespace-mixin");
assert!(false_guard_namespace_fixture.is_some_and(|fixture| {
fixture.native_replacement_count == 0
&& fixture.native_structural_edit_count > 0
&& fixture.native_edit_output_matches_evaluated_css
}));
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.ruleset-guarded-mixin")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.isruleset-predicate")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.isdefined-predicate")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.property-isdefined-predicate")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.property-variable-alias")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.isdefined-guarded-mixin")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.property-guarded-mixin")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.rgb-color-constructors")
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "less.format-string")
);
}
#[test]
fn exposes_scss_control_flow_oracle_corpus_through_query_boundary() {
let summary = summarize_omena_query_scss_evaluator_control_flow_oracle_corpus();
assert_eq!(summary.schema_version, "0");
assert_eq!(
summary.product,
"omena-query.scss-evaluator-control-flow-oracle-corpus"
);
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert_eq!(summary.node_key_type, STABLE_NODE_KEY_TYPE_LABEL_V0);
assert_eq!(summary.fixture_count, 69);
assert_eq!(summary.scss_fixture_count, 34);
assert_eq!(summary.sass_fixture_count, 34);
assert_eq!(summary.supported_fixture_count, 68);
assert_eq!(summary.rejected_flat_css_fixture_count, 1);
assert!(summary.branch_fixture_count >= 5);
assert!(summary.loop_fixture_count >= 6);
assert!(summary.back_edge_fixture_count >= 6);
assert!(summary.call_return_fixture_count >= 5);
assert!(summary.resolved_call_return_fixture_count >= 4);
assert!(summary.top_call_return_fixture_count >= 1);
assert!(summary.recursive_call_fixture_count >= 1);
assert_eq!(
summary.converged_value_analysis_fixture_count,
summary.supported_fixture_count
);
assert_eq!(
summary.prune_reachability_fixture_count,
summary.supported_fixture_count
);
assert_eq!(
summary.prune_reachability_flat_css_cfg_built_count,
summary.supported_fixture_count
);
assert!(summary.prune_reachability_changed_fixture_count > 0);
assert_eq!(
summary.flat_css_cfg_built_count,
summary.supported_fixture_count
);
assert_eq!(summary.merged_cross_file_graph_count, 0);
assert!(summary.all_supported_fixtures_converged);
assert!(!summary.no_flat_css_cfg_built);
assert!(summary.no_merged_cross_file_graph);
assert_eq!(
summary.corpus.product,
"omena-scss-eval.control-flow-oracle-corpus"
);
let sass_while_index = summary
.corpus
.fixtures
.iter()
.position(|fixture| fixture.id == "sass.static-while-loop")
.unwrap_or(summary.corpus.fixtures.len());
assert!(
sass_while_index < summary.corpus.fixtures.len(),
"query boundary must expose the Sass while-loop oracle fixture"
);
let sass_while = &summary.corpus.fixtures[sass_while_index];
assert!(sass_while.control_flow_available);
assert!(sass_while.value_analysis_converged);
assert!(sass_while.loop_block_count >= 1);
assert!(sass_while.back_edge_count >= 1);
let sass_return_index = summary
.corpus
.fixtures
.iter()
.position(|fixture| fixture.id == "sass.static-for-return")
.unwrap_or(summary.corpus.fixtures.len());
assert!(
sass_return_index < summary.corpus.fixtures.len(),
"query boundary must expose the Sass function-return oracle fixture"
);
let sass_return = &summary.corpus.fixtures[sass_return_index];
assert!(sass_return.control_flow_available);
assert!(sass_return.call_return_available);
assert!(sass_return.value_analysis_converged);
assert!(sass_return.loop_block_count >= 1);
assert!(sass_return.back_edge_count >= 1);
assert!(sass_return.call_resolved_return_value_count >= 1);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "scss.descending-static-for-return"
&& fixture.call_resolved_return_value_count == 1
&& fixture.value_analysis_converged)
);
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "sass.descending-static-for-return"
&& fixture.dialect == "sass"
&& fixture.call_resolved_return_value_count == 1
&& fixture.value_analysis_converged));
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "scss.static-for-expression-bounds"
&& fixture.call_resolved_return_value_count == 1
&& fixture.value_analysis_converged)
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "scss.static-for-exclusive-bound"
&& fixture.call_resolved_return_value_count == 1
&& fixture.value_analysis_converged)
);
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "scss.static-for-finite-set-bound"
&& fixture.loop_block_count == 2
&& fixture.back_edge_count == 2
&& fixture.value_analysis_converged));
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "sass.static-for-finite-set-bound"
&& fixture.dialect == "sass"
&& fixture.loop_block_count == 2
&& fixture.back_edge_count == 2
&& fixture.value_analysis_converged));
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "sass.static-for-expression-bounds"
&& fixture.dialect == "sass"
&& fixture.call_resolved_return_value_count == 1
&& fixture.value_analysis_converged));
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "sass.static-for-exclusive-bound"
&& fixture.dialect == "sass"
&& fixture.call_resolved_return_value_count == 1
&& fixture.value_analysis_converged));
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "scss.static-while-expression-step"
&& fixture.call_resolved_return_value_count == 1
&& fixture.value_analysis_converged)
);
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "scss.static-while-finite-set-bound"
&& fixture.loop_block_count == 2
&& fixture.back_edge_count == 2
&& fixture.value_analysis_converged));
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "sass.static-while-finite-set-bound"
&& fixture.dialect == "sass"
&& fixture.loop_block_count == 2
&& fixture.back_edge_count == 2
&& fixture.value_analysis_converged));
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "sass.static-while-expression-step"
&& fixture.dialect == "sass"
&& fixture.call_resolved_return_value_count == 1
&& fixture.value_analysis_converged));
for id in [
"scss.static-default-function-arguments",
"scss.static-default-argument-prior-parameter",
"scss.static-named-default-argument-prior-parameter",
"sass.static-default-function-arguments",
"sass.static-default-argument-prior-parameter",
"sass.static-named-default-argument-prior-parameter",
"scss.static-named-function-arguments",
"scss.static-named-argument-default-tail",
"sass.static-named-function-arguments",
"sass.static-named-argument-default-tail",
"scss.static-hyphen-underscore-function-reference",
"scss.static-hyphen-underscore-named-argument",
"sass.static-hyphen-underscore-function-reference",
"sass.static-hyphen-underscore-named-argument",
] {
assert!(
summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == id
&& fixture.call_resolved_return_value_count == 1
&& fixture.exact_call_resolved_return_value_count == 1
&& fixture.value_analysis_converged
}),
"query boundary must expose control-flow default-argument fixture {id}"
);
}
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "sass.static-each-return"
&& fixture.dialect == "sass"
&& fixture.call_resolved_return_value_count == 1
&& fixture.value_analysis_converged)
);
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "sass.static-each-tuple-function-source-return"
&& fixture.dialect == "sass"
&& fixture.call_resolved_return_value_count == 1
&& fixture.value_analysis_converged));
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "sass.nested-static-loop-return"
&& fixture.dialect == "sass"
&& fixture.call_resolved_return_value_count == 1
&& fixture.value_analysis_converged));
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "sass.dynamic-loop-top"
&& fixture.dialect == "sass"
&& fixture.top_call_resolved_return_value_count == 1
&& fixture.value_analysis_converged)
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "sass.recursive-mixin-cap"
&& fixture.dialect == "sass"
&& fixture.capped_recursive_call_count == 1
&& fixture.value_analysis_converged)
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "scss.nested-static-loop-return"
&& fixture.call_resolved_return_value_count == 1)
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "scss.recursive-mixin-cap"
&& fixture.capped_recursive_call_count == 1)
);
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "sass.branch-if-else"
&& fixture.dialect == "sass"
&& fixture.supported_dialect
&& fixture.branch_block_count == 2
&& fixture.value_analysis_converged)
);
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "scss.mixin-branch-control-flow"
&& fixture.supported_dialect
&& fixture.control_flow_available
&& fixture.call_return_available
&& fixture.branch_block_count == 2
&& fixture.call_return_edge_count == 1
&& fixture.value_analysis_converged));
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "sass.mixin-branch-control-flow"
&& fixture.dialect == "sass"
&& fixture.supported_dialect
&& fixture.control_flow_available
&& fixture.call_return_available
&& fixture.branch_block_count == 2
&& fixture.call_return_edge_count == 1
&& fixture.value_analysis_converged));
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "scss.mixin-loop-control-flow"
&& fixture.supported_dialect
&& fixture.control_flow_available
&& fixture.call_return_available
&& fixture.loop_block_count == 1
&& fixture.back_edge_count == 1
&& fixture.call_return_edge_count == 1
&& fixture.value_analysis_converged));
assert!(summary.corpus.fixtures.iter().any(|fixture| fixture.id
== "sass.mixin-loop-control-flow"
&& fixture.dialect == "sass"
&& fixture.supported_dialect
&& fixture.control_flow_available
&& fixture.call_return_available
&& fixture.loop_block_count == 1
&& fixture.back_edge_count == 1
&& fixture.call_return_edge_count == 1
&& fixture.value_analysis_converged));
for id in [
"scss.static-named-mixin-arguments",
"scss.static-named-mixin-default-tail",
"scss.static-mixin-default-argument-prior-parameter",
"scss.static-named-mixin-default-argument-prior-parameter",
"scss.static-mixin-content-block",
"scss.static-mixin-content-arguments",
"scss.static-mixin-content-expression-arguments",
"scss.static-hyphen-underscore-mixin-include",
"sass.static-named-mixin-arguments",
"sass.static-named-mixin-default-tail",
"sass.static-mixin-default-argument-prior-parameter",
"sass.static-named-mixin-default-argument-prior-parameter",
"sass.static-mixin-content-block",
"sass.static-mixin-content-arguments",
"sass.static-mixin-content-expression-arguments",
"sass.static-hyphen-underscore-mixin-include",
] {
assert!(
summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == id
&& fixture.call_return_available
&& fixture.call_return_edge_count == 1
&& fixture.value_analysis_converged
}),
"query boundary must expose mixin call edge oracle fixture {id}"
);
}
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "scss.static-mixin-content-nested-include"
&& fixture.call_return_available
&& fixture.call_return_edge_count == 2
&& fixture.value_analysis_converged
}));
assert!(summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == "sass.static-mixin-content-nested-include"
&& fixture.call_return_available
&& fixture.call_return_edge_count == 2
&& fixture.value_analysis_converged
}));
for id in [
"scss.static-nested-mixin-include",
"sass.static-nested-mixin-include",
] {
assert!(
summary.corpus.fixtures.iter().any(|fixture| {
fixture.id == id
&& fixture.call_return_available
&& fixture.call_return_edge_count == 2
&& fixture.value_analysis_converged
}),
"query boundary must expose nested mixin call edge oracle fixture {id}"
);
}
assert!(
summary
.corpus
.fixtures
.iter()
.any(|fixture| fixture.id == "css.flat-rejected"
&& !fixture.supported_dialect
&& !fixture.control_flow_available
&& !fixture.value_analysis_available
&& !fixture.call_return_available)
);
}
#[test]
fn exposes_static_stylesheet_evaluator_oracle_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$gap: 1px; .card { margin: $gap; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "scss");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert!(summary.value_resolution_available);
assert!(summary.native_edit_output.as_ref().is_some_and(|output| {
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| output == &evaluation.evaluated_css)
}));
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_replacement_legacy_reflection_count, 1);
assert_eq!(summary.native_replacement_legacy_unreflected_count, 0);
assert_eq!(summary.native_edit_count, 2);
assert_eq!(summary.native_value_edit_count, 1);
assert_eq!(summary.native_structural_edit_count, 1);
assert!(summary.native_edit_output_matches_evaluated_css);
assert_eq!(summary.native_value_reference_count, 1);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert_eq!(summary.native_cycle_value_count, 0);
assert_eq!(summary.native_fuel_exhausted_value_count, 0);
assert_eq!(summary.native_unresolved_reference_value_count, 0);
assert_eq!(summary.native_unsupported_dynamic_value_count, 0);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("margin: 1px"))
);
assert!(
summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.native_edit_output == evaluation.evaluated_css
})
);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.native_edits.iter().any(|edit| {
edit.edit_kind == "valueReplacement"
&& edit.replacement == "1px"
&& edit.abstract_value_kind == Some("exact")
})
}));
}
#[test]
fn exposes_sass_static_stylesheet_evaluator_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$gap: 1px\n.card\n margin: $gap",
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "sass");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert!(summary.value_resolution_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_replacement_legacy_reflection_count, 1);
assert_eq!(summary.native_replacement_legacy_unreflected_count, 0);
assert_eq!(summary.native_edit_count, 2);
assert_eq!(summary.native_value_edit_count, 1);
assert_eq!(summary.native_structural_edit_count, 1);
assert!(summary.native_edit_output_matches_evaluated_css);
assert_eq!(summary.native_value_reference_count, 1);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert_eq!(summary.native_cycle_value_count, 0);
assert_eq!(summary.native_fuel_exhausted_value_count, 0);
assert_eq!(summary.native_unresolved_reference_value_count, 0);
assert_eq!(summary.native_unsupported_dynamic_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css == ".card\n margin: 1px"
&& evaluation.native_edit_output == evaluation.evaluated_css
}));
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.native_edits.iter().any(|edit| {
edit.edit_kind == "valueReplacement"
&& edit.replacement == "1px"
&& edit.abstract_value_kind == Some("exact")
})
}));
}
#[test]
fn exposes_unresolved_forward_scss_composite_as_preserved_oracle_output() {
let source = "$border: 1px solid $brand; $brand: red; .button { border: $border; }";
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert!(summary.value_resolution_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_top_value_count, 1);
assert_eq!(summary.native_unresolved_reference_value_count, 1);
assert_eq!(summary.native_unsupported_dynamic_value_count, 0);
let Some(resolution) = summary.value_resolution.as_ref() else {
return;
};
assert_eq!(resolution.reference_count, 1);
assert_eq!(resolution.unresolved_reference_count, 1);
assert_eq!(resolution.values[0].outcome, "top");
assert_eq!(resolution.values[0].reason, "unresolvedReference");
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css == source
&& evaluation.replacement_count == 0
&& evaluation.oracle.all_legacy_declaration_values_preserved
}));
}
#[test]
fn exposes_dynamic_scss_function_calls_as_preserved_oracle_output() {
let source = "@function tone($enabled) { @if $enabled { @return red; } @else { @return blue; } } .button { color: tone(var(--enabled)); }";
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert!(summary.value_resolution_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_top_value_count, 1);
assert_eq!(summary.native_unresolved_reference_value_count, 0);
assert_eq!(summary.native_unsupported_dynamic_value_count, 1);
let Some(resolution) = summary.value_resolution.as_ref() else {
return;
};
assert_eq!(resolution.reference_count, 1);
assert_eq!(resolution.unsupported_dynamic_count, 1);
assert_eq!(resolution.values[0].outcome, "top");
assert_eq!(resolution.values[0].reason, "unsupportedDynamic");
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css == source
&& evaluation.replacement_count == 0
&& evaluation.oracle.all_legacy_declaration_values_preserved
}));
}
#[test]
fn exposes_static_scss_legacy_rounding_aliases_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$ceil: ceil(1.2px); $floor: floor(1.8px); $round: round(1.5px); .card { top: $ceil; bottom: $floor; left: $round; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 3);
assert_eq!(summary.native_resolved_value_count, 3);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("top: 2px"))
);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("bottom: 1px"))
);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("left: 2px"))
);
}
#[test]
fn exposes_static_scss_math_percentage_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$ratio: math.percentage(.25); .card { width: $ratio; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 1);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 0);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("width: 25%"))
);
}
#[test]
fn exposes_static_scss_math_trig_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$sin: math.sin(30deg); $atan2: math.atan2(1px, 1px); .card { opacity: $sin; rotate: $atan2; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 2);
assert_eq!(summary.native_resolved_value_count, 2);
assert_eq!(summary.native_raw_value_count, 0);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("opacity: 0.5"))
);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("rotate: 45deg"))
);
}
#[test]
fn exposes_static_scss_math_constants_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$pi: math.$pi; $e: math.$e; .card { --pi: $pi; --e: $e; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 2);
assert_eq!(summary.native_resolved_value_count, 2);
assert_eq!(summary.native_raw_value_count, 0);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("--pi: 3.1415926536"))
);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("--e: 2.7182818285"))
);
}
#[test]
fn exposes_static_scss_math_constant_arguments_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$sin: math.sin(math.$pi); $unitless: if(math.is-unitless(math.$pi), 1px, 2px); .card { opacity: $sin; margin: $unitless; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 2);
assert_eq!(summary.native_resolved_value_count, 2);
assert_eq!(summary.native_raw_value_count, 0);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("opacity: 0"))
);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("margin: 1px"))
);
}
#[test]
fn exposes_static_scss_legacy_list_metadata_aliases_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$separator: list-separator((1px, 2px)); $bracketed: if(is-bracketed([1px]), 1px, 2px); .card { content: $separator; margin: $bracketed; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 2);
assert_eq!(summary.native_resolved_value_count, 2);
assert_eq!(summary.native_raw_value_count, 0);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("content: \"comma\""))
);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("margin: 1px"))
);
}
#[test]
fn exposes_static_scss_slash_lists_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$stroke: list.slash(1px, solid, red); $separator: list.separator($stroke); .card { font: $stroke; content: $separator; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 2);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 1);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("font: 1px / solid / red"))
);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("content: \"slash\""))
);
}
#[test]
fn exposes_static_scss_function_comparison_operands_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$stroke: list.slash(1px, solid, red); $kind: if(meta.type-of($stroke) == list and list.separator($stroke) == \"slash\" and hue(#808000) == 60deg, 1px, 2px); .card { font: $stroke; margin: $kind; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 2);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 1);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("font: 1px / solid / red"))
);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("margin: 1px"))
);
}
#[test]
fn exposes_static_scss_hsl_color_constructors_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$tone: hsl(180, 100%, 50%); $overlay: hsla(120, 100%, 50%, .5); .card { color: $tone; background: $overlay; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 2);
assert_eq!(summary.native_resolved_value_count, 2);
assert_eq!(summary.native_raw_value_count, 0);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("color: #0ff"))
);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains("background: rgba(0, 255, 0, 0.5)")
}));
}
#[test]
fn exposes_static_scss_ie_hex_str_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$legacy: ie-hex-str(rgba(red, .5)); .card { color: $legacy; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 1);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 0);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("color: #80FF0000"))
);
}
#[test]
fn exposes_static_scss_inspect_values_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$tone: meta.inspect(red); $gap: inspect(2px); .card { color: $tone; margin: $gap; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 2);
assert_eq!(summary.native_resolved_value_count, 2);
assert_eq!(summary.native_raw_value_count, 0);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("color: red"))
);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("margin: 2px"))
);
}
#[test]
fn exposes_static_scss_dynamic_mixin_locals_as_preserved_oracle_output_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@mixin tone { $space: meta.inspect((a: b)); margin: $space; } .button { @include tone; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("@mixin tone")
&& evaluation.evaluated_css.contains("meta.inspect((a: b))")
&& evaluation.evaluated_css.contains("@include tone")
&& !evaluation.evaluated_css.contains("margin: (a: b)")
}));
}
#[test]
fn exposes_static_scss_mixin_if_blocks_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@mixin tone($enabled) { @if $enabled { color: red; } @else { color: blue; } } .button { @include tone(false); }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.native_structural_edit_count >= 2);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@mixin")
&& !evaluation.evaluated_css.contains("@include")
&& !evaluation.evaluated_css.contains("@if")
&& evaluation.evaluated_css.contains("color: blue")
&& !evaluation.evaluated_css.contains("color: red")
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_sass_mixin_if_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@mixin tone($enabled)\n @if $enabled\n color: red\n @else\n color: blue\n.button\n @include tone(false)",
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_replacement_legacy_reflection_count, 0);
assert_eq!(summary.native_structural_edit_count, 2);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@mixin")
&& !evaluation.evaluated_css.contains("@include")
&& !evaluation.evaluated_css.contains("@if")
&& !evaluation.evaluated_css.contains("@else")
&& evaluation.evaluated_css.contains("color: blue")
&& !evaluation.evaluated_css.contains("color: red")
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_scss_mixin_for_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@mixin items($count) { @for $i from 1 through $count { order: $i; } } .button { @include items(3); }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_structural_edit_count, 2);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@mixin")
&& !evaluation.evaluated_css.contains("@include")
&& !evaluation.evaluated_css.contains("@for")
&& !evaluation.evaluated_css.contains("$i")
&& evaluation.evaluated_css.contains("order: 1")
&& evaluation.evaluated_css.contains("order: 2")
&& evaluation.evaluated_css.contains("order: 3")
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_sass_mixin_for_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@mixin items($count)\n @for $i from 1 through $count\n order: $i\n.button\n @include items(3)",
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_structural_edit_count, 2);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@mixin")
&& !evaluation.evaluated_css.contains("@include")
&& !evaluation.evaluated_css.contains("@for")
&& !evaluation.evaluated_css.contains("$i")
&& evaluation.evaluated_css.contains("order: 1")
&& evaluation.evaluated_css.contains("order: 2")
&& evaluation.evaluated_css.contains("order: 3")
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_sass_mixin_each_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@mixin tones()\n @each $tone in red, blue\n color: $tone\n.button\n @include tones()",
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_structural_edit_count, 2);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@mixin")
&& !evaluation.evaluated_css.contains("@include")
&& !evaluation.evaluated_css.contains("@each")
&& !evaluation.evaluated_css.contains("$tone")
&& evaluation.evaluated_css.contains("color: red")
&& evaluation.evaluated_css.contains("color: blue")
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_sass_mixin_while_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@mixin items()\n $i: 0\n @while $i < 3\n $i: $i + 1\n order: $i\n.button\n @include items()",
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_structural_edit_count, 2);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@mixin")
&& !evaluation.evaluated_css.contains("@include")
&& !evaluation.evaluated_css.contains("@while")
&& !evaluation.evaluated_css.contains("$i")
&& evaluation.evaluated_css.contains("order: 1")
&& evaluation.evaluated_css.contains("order: 2")
&& evaluation.evaluated_css.contains("order: 3")
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_scss_top_level_if_blocks_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$enabled: false; @if $enabled { .on { color: green; } } @else { .off { color: red; } }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@if")
&& !evaluation.evaluated_css.contains("@else")
&& !evaluation.evaluated_css.contains("$enabled")
&& evaluation.evaluated_css.contains(".off { color: red; }")
&& !evaluation.evaluated_css.contains(".on { color: green; }")
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_dynamic_scss_top_level_if_blocks_as_preserved_oracle_through_query_boundary() {
let source = "$enabled: var(--enabled); @if $enabled { .on { color: green; } } @else { .off { color: red; } }";
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.native_raw_value_count > 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css == source
&& evaluation.native_edit_count == 0
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_scss_top_level_if_value_replacements_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$enabled: true; $brand: red; @if $enabled { .on { color: $brand; } } @else { .off { color: blue; } }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_replacement_legacy_reflection_count, 1);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@if")
&& !evaluation.evaluated_css.contains("@else")
&& !evaluation.evaluated_css.contains("$brand")
&& evaluation.evaluated_css.contains(".on { color: red; }")
&& !evaluation.evaluated_css.contains(".off { color: blue; }")
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "$brand"
&& replacement.text == "red"
&& replacement.abstract_value_kind == "exact"
})
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_scss_top_level_if_function_replacements_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@function tone($color) { @return $color; } $enabled: true; @if $enabled { .on { color: tone(red); } } @else { .off { color: blue; } }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_replacement_legacy_reflection_count, 1);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@function")
&& !evaluation.evaluated_css.contains("@if")
&& !evaluation.evaluated_css.contains("tone(red)")
&& evaluation.evaluated_css.contains(".on { color: red; }")
&& !evaluation.evaluated_css.contains(".off { color: blue; }")
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "function:tone"
&& replacement.text == "red"
&& replacement.abstract_value_kind == "exact"
})
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_scss_top_level_for_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@for $i from 1 through 3 { .n { order: $i; } }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert_eq!(summary.native_replacement_count, 3);
assert_eq!(summary.native_replacement_legacy_reflection_count, 3);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@for")
&& !evaluation.evaluated_css.contains("$i")
&& evaluation.evaluated_css.contains("order: 1")
&& evaluation.evaluated_css.contains("order: 2")
&& evaluation.evaluated_css.contains("order: 3")
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "$i"
&& replacement.text == "1"
&& replacement.abstract_value_kind == "exact"
})
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_scss_top_level_each_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@each $tone in red, blue { .n { color: $tone; } }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert_eq!(summary.native_replacement_count, 2);
assert_eq!(summary.native_replacement_legacy_reflection_count, 2);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@each")
&& !evaluation.evaluated_css.contains("$tone")
&& evaluation.evaluated_css.contains("color: red")
&& evaluation.evaluated_css.contains("color: blue")
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "$tone"
&& replacement.text == "red"
&& replacement.abstract_value_kind == "exact"
})
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_scss_top_level_while_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$i: 0; @while $i < 3 { $i: $i + 1; .n { order: $i; } }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert_eq!(summary.native_replacement_count, 3);
assert_eq!(summary.native_replacement_legacy_reflection_count, 3);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@while")
&& !evaluation.evaluated_css.contains("$i")
&& evaluation.evaluated_css.contains("order: 1")
&& evaluation.evaluated_css.contains("order: 2")
&& evaluation.evaluated_css.contains("order: 3")
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "$i"
&& replacement.text == "1"
&& replacement.abstract_value_kind == "exact"
})
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_sass_top_level_loop_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$i: 0\n@while $i < 3\n $i: $i + 1\n .n\n order: $i",
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert_eq!(summary.native_replacement_count, 3);
assert_eq!(summary.native_replacement_legacy_reflection_count, 3);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@while")
&& !evaluation.evaluated_css.contains("$i")
&& evaluation.evaluated_css.contains("order: 1")
&& evaluation.evaluated_css.contains("order: 2")
&& evaluation.evaluated_css.contains("order: 3")
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_sass_top_level_if_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$enabled: true\n@if $enabled\n .on\n color: green\n@else\n .off\n color: gray",
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_replacement_legacy_reflection_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@if")
&& !evaluation.evaluated_css.contains("@else")
&& !evaluation.evaluated_css.contains("$enabled")
&& evaluation.evaluated_css.contains("color: green")
&& !evaluation.evaluated_css.contains("color: gray")
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_sass_top_level_if_value_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$enabled: true\n$brand: green\n@if $enabled\n .on\n color: $brand\n@else\n .off\n color: gray",
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_replacement_legacy_reflection_count, 1);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@if")
&& !evaluation.evaluated_css.contains("@else")
&& !evaluation.evaluated_css.contains("$brand")
&& evaluation.evaluated_css.contains("color: green")
&& !evaluation.evaluated_css.contains("color: gray")
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_sass_top_level_if_function_expansion_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@function tone($color)\n @return $color\n$enabled: true\n@if $enabled\n .on\n color: tone(green)\n@else\n .off\n color: gray",
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_replacement_legacy_reflection_count, 1);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@function")
&& !evaluation.evaluated_css.contains("@if")
&& !evaluation.evaluated_css.contains("@else")
&& !evaluation.evaluated_css.contains("tone(green)")
&& evaluation.evaluated_css.contains("color: green")
&& !evaluation.evaluated_css.contains("color: gray")
&& evaluation.native_edit_output_matches_evaluated_css
}));
}
#[test]
fn exposes_static_scss_recursive_nested_mixin_includes_as_preserved_oracle_output_through_query_boundary()
{
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@mixin a { @include b; } @mixin b { @include a; } .button { @include a; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("@mixin a")
&& evaluation.evaluated_css.contains("@mixin b")
&& evaluation.evaluated_css.contains("@include a")
&& evaluation.evaluated_css.contains("@include b")
}));
}
#[test]
fn exposes_nested_static_scss_color_helpers_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$tone: list.nth(list.append(1px, transparentize(red, .25)), 2); $scaled: list.nth(list.append(1px, color.scale(#808000, $lightness: 50%)), 2); $opacity: list.nth(list.append(1px, color.opacity(rgba(red, .5))), 2); .card { color: $tone; background: $scaled; opacity: $opacity; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 3);
assert_eq!(summary.native_resolved_value_count, 3);
assert_eq!(summary.native_raw_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains("color: rgba(255, 0, 0, 0.75)")
}));
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| { evaluation.evaluated_css.contains("background: #ffff40") })
);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("opacity: 0.5"))
);
}
#[test]
fn exposes_alpha_aware_scss_color_mix_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"$tone: color.mix(rgba(red, .5), blue); $nested: color.mix(transparentize(red, .25), blue); .card { color: $tone; border-color: $nested; }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_value_reference_count, 2);
assert_eq!(summary.native_resolved_value_count, 2);
assert_eq!(summary.native_raw_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains("color: rgba(63.75, 0, 191.25, 0.75)")
}));
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains("border-color: rgba(95.625, 0, 159.375, 0.875)")
}));
}
#[test]
fn exposes_less_static_stylesheet_evaluator_oracle_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@gap: 2px; .card { margin: @gap; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_resolved_value_count, 1);
assert!(
summary
.evaluation
.as_ref()
.is_some_and(|evaluation| evaluation.evaluated_css.contains("margin: 2px"))
);
}
#[test]
fn exposes_less_property_name_interpolation_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@prop: color; .card { @{prop}: red; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_edit_count, 2);
assert_eq!(summary.native_structural_edit_count, 2);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("color: red")
&& !evaluation.evaluated_css.contains("@{prop}")
&& !evaluation.evaluated_css.contains("@prop:")
}));
}
#[test]
fn exposes_less_simple_selector_interpolation_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@name: card; .@{name} { color: red; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_edit_count, 2);
assert_eq!(summary.native_structural_edit_count, 2);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains(".card")
&& !evaluation.evaluated_css.contains("@{name}")
&& !evaluation.evaluated_css.contains("@name:")
}));
}
#[test]
fn exposes_less_chained_class_selector_interpolation_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@prefix: card; @suffix: primary; .@{prefix}-@{suffix} { color: red; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_edit_count, 4);
assert_eq!(summary.native_structural_edit_count, 4);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains(".card-primary")
&& !evaluation.evaluated_css.contains("@{prefix}")
&& !evaluation.evaluated_css.contains("@{suffix}")
&& !evaluation.evaluated_css.contains("@prefix:")
&& !evaluation.evaluated_css.contains("@suffix:")
}));
}
#[test]
fn exposes_less_chained_id_selector_interpolation_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@prefix: card; @suffix: primary; #@{prefix}-@{suffix} { color: red; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_edit_count, 4);
assert_eq!(summary.native_structural_edit_count, 4);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("#card-primary")
&& !evaluation.evaluated_css.contains("@{prefix}")
&& !evaluation.evaluated_css.contains("@{suffix}")
&& !evaluation.evaluated_css.contains("@prefix:")
&& !evaluation.evaluated_css.contains("@suffix:")
}));
}
#[test]
fn exposes_less_chained_type_selector_interpolation_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@prefix: button; @suffix: primary; @{prefix}-@{suffix} { color: red; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_edit_count, 4);
assert_eq!(summary.native_structural_edit_count, 4);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("button-primary")
&& !evaluation.evaluated_css.contains("@{prefix}")
&& !evaluation.evaluated_css.contains("@{suffix}")
&& !evaluation.evaluated_css.contains("@prefix:")
&& !evaluation.evaluated_css.contains("@suffix:")
}));
}
#[test]
fn rejects_less_value_interpolation_without_query_partial_mutation() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@color: red; .button { color: @{color}; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.evaluation_available);
assert_eq!(summary.product_output_source, "none");
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_edit_count, 0);
}
#[test]
fn exposes_less_quoted_value_interpolation_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
r#"@path: "../img"; @theme: light; .card { color: "@{theme}"; background: url("@{path}/icon.png"); }"#,
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_edit_count, 4);
assert_eq!(summary.native_structural_edit_count, 4);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains(r#"color: "light""#)
&& evaluation
.evaluated_css
.contains(r#"background: url("../img/icon.png")"#)
&& !evaluation.evaluated_css.contains("@{theme}")
&& !evaluation.evaluated_css.contains("@{path}")
&& !evaluation.evaluated_css.contains("@theme:")
&& !evaluation.evaluated_css.contains("@path:")
}));
}
#[test]
fn exposes_less_escaped_quoted_value_interpolation_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
r#"@theme: light; .card { color: ~"@{theme}"; }"#,
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("color: light")
&& !evaluation.evaluated_css.contains("@{theme}")
&& !evaluation.evaluated_css.contains("~\"light\"")
&& !evaluation.evaluated_css.contains("@theme:")
}));
}
#[test]
fn exposes_less_variable_indirection_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@name: color; @color: red; .card { color: @@name; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 1);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("color: red")
&& !evaluation.evaluated_css.contains("@@name")
&& !evaluation.evaluated_css.contains("@name:")
&& !evaluation.evaluated_css.contains("@color:")
}));
}
#[test]
fn exposes_less_variable_indirection_aliases_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@name: color; @color: red; @alias: @@name; .card { color: @alias; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 1);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("color: red")
&& !evaluation.evaluated_css.contains("@alias")
&& !evaluation.evaluated_css.contains("@@name")
&& !evaluation.evaluated_css.contains("@name:")
&& !evaluation.evaluated_css.contains("@color:")
}));
}
#[test]
fn exposes_less_dynamic_escaped_strings_as_preserved_raw_oracle_output_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@filter: ~\"@{name}\"; .card { filter: @filter; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_resolved_value_count, 0);
assert_eq!(summary.native_raw_value_count, 1);
assert_eq!(summary.native_top_value_count, 0);
assert_eq!(summary.native_unsupported_dynamic_value_count, 1);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("filter: ~\"@{name}\"")
&& !evaluation.evaluated_css.contains("@filter:")
}));
}
#[test]
fn exposes_less_fuel_exhaustion_reason_through_query_boundary() {
let mut source = String::new();
for index in 0..130 {
let _ = write!(source, "@v{index}: @v{}; ", index + 1);
}
source.push_str("@v130: 1px; .button { width: @v0; }");
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
source.as_str(),
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.evaluation_available);
assert!(summary.value_resolution_available);
assert_eq!(summary.native_value_reference_count, 1);
assert_eq!(summary.native_top_value_count, 1);
assert_eq!(summary.native_fuel_exhausted_value_count, 1);
assert_eq!(summary.native_unresolved_reference_value_count, 0);
assert_eq!(summary.native_unsupported_dynamic_value_count, 0);
let Some(resolution) = summary.value_resolution.as_ref() else {
return;
};
assert_eq!(resolution.reference_count, 1);
assert_eq!(resolution.fuel_exhausted_count, 1);
assert_eq!(resolution.values[0].outcome, "top");
assert_eq!(resolution.values[0].reason, "fuelExhausted");
}
#[test]
fn exposes_less_recursive_nested_mixin_calls_as_preserved_oracle_output_through_query_boundary() {
let source = ".again() { .again(); } .button { .again(); }";
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
source,
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css == source
&& evaluation.replacement_count == 0
&& evaluation.oracle.all_legacy_declaration_values_preserved
}));
}
#[test]
fn exposes_less_unit_builtin_evaluator_oracle_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@gap: unit(5, px); @plain: unit(5px); @unit-name: get-unit(1.5rem); .button { margin: @gap; padding: @plain; --unit: @unit-name; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 3);
assert_eq!(summary.native_resolved_value_count, 3);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("margin: 5px")
&& evaluation.evaluated_css.contains("padding: 5")
&& evaluation.evaluated_css.contains("--unit: rem")
}));
}
#[test]
fn exposes_less_convert_builtin_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@cm: convert(1in, cm); @inch: convert(2.54cm, in); @px: convert(96px, in); @ms: convert(1s, ms); @sec: convert(250ms, s); @deg: convert(1rad, deg); @turn: convert(.5turn, deg); @same: convert(1in, s); .button { cm: @cm; inch: @inch; px: @px; ms: @ms; sec: @sec; deg: @deg; turn: @turn; same: @same; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 8);
assert_eq!(summary.native_resolved_value_count, 8);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("cm: 2.54cm")
&& evaluation.evaluated_css.contains("inch: 1in")
&& evaluation.evaluated_css.contains("px: 1in")
&& evaluation.evaluated_css.contains("ms: 1000ms")
&& evaluation.evaluated_css.contains("sec: 0.25s")
&& evaluation.evaluated_css.contains("deg: 57.29577951deg")
&& evaluation.evaluated_css.contains("turn: 180deg")
&& evaluation.evaluated_css.contains("same: 1in")
}));
}
#[test]
fn exposes_less_trig_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@pi: pi(); @sin: sin(30deg); @sinRad: sin(1rad); @sinUnitless: sin(1); @cos: cos(60deg); @tan: tan(45deg); @asin: asin(.5); @acos: acos(.5); @atan: atan(1); .button { pi: @pi; sin: @sin; sin-rad: @sinRad; sin-unitless: @sinUnitless; cos: @cos; tan: @tan; asin: @asin; acos: @acos; atan: @atan; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 9);
assert_eq!(summary.native_resolved_value_count, 9);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("pi: 3.14159265")
&& evaluation.evaluated_css.contains("sin: 0.5")
&& evaluation.evaluated_css.contains("sin-rad: 0.84147098")
&& evaluation
.evaluated_css
.contains("sin-unitless: 0.84147098")
&& evaluation.evaluated_css.contains("cos: 0.5")
&& evaluation.evaluated_css.contains("tan: 1")
&& evaluation.evaluated_css.contains("asin: 0.52359878rad")
&& evaluation.evaluated_css.contains("acos: 1.04719755rad")
&& evaluation.evaluated_css.contains("atan: 0.78539816rad")
}));
}
#[test]
fn exposes_less_percentage_and_rounding_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@ratio: percentage(.5); @ceil: ceil(1.2px); @floor: floor(1.8px); .button { width: @ratio; top: @ceil; bottom: @floor; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 3);
assert_eq!(summary.native_resolved_value_count, 3);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("width: 50%")
&& evaluation.evaluated_css.contains("top: 2px")
&& evaluation.evaluated_css.contains("bottom: 1px")
}));
}
#[test]
fn exposes_less_numeric_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@sqrt: sqrt(4); @pow: pow(2, 3); @mod: mod(11px, 4px); @min: min(1px, 2px, 3px); @max: max(1px, 2px, 3px); @abs: abs(-2.4px); @round1: round(1.6px); @round2: round(1.234px, 2); .button { sqrt: @sqrt; pow: @pow; mod: @mod; min: @min; max: @max; abs: @abs; round1: @round1; round2: @round2; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 8);
assert_eq!(summary.native_resolved_value_count, 8);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("sqrt: 2")
&& evaluation.evaluated_css.contains("pow: 8")
&& evaluation.evaluated_css.contains("mod: 3px")
&& evaluation.evaluated_css.contains("min: 1px")
&& evaluation.evaluated_css.contains("max: 3px")
&& evaluation.evaluated_css.contains("abs: 2.4px")
&& evaluation.evaluated_css.contains("round1: 2px")
&& evaluation.evaluated_css.contains("round2: 1.23px")
}));
}
#[test]
fn preserves_less_unsupported_css_math_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@sign: sign(-2px); @clamp: clamp(1px, 3px, 2px); @rem: rem(11px, 4px); @hypot: hypot(3px, 4px); @exp: exp(1); @log: log(8, 2); @calc: calc(1px + 2px); .button { sign: @sign; clamp: @clamp; rem: @rem; hypot: @hypot; exp: @exp; log: @log; calc: @calc; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 7);
assert_eq!(summary.native_raw_value_count, 7);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("sign: sign(-2px)")
&& evaluation
.evaluated_css
.contains("clamp: clamp(1px, 3px, 2px)")
&& evaluation.evaluated_css.contains("rem: rem(11px, 4px)")
&& evaluation.evaluated_css.contains("hypot: hypot(3px, 4px)")
&& evaluation.evaluated_css.contains("exp: exp(1)")
&& evaluation.evaluated_css.contains("log: log(8, 2)")
&& evaluation.evaluated_css.contains("calc: calc(1px + 2px)")
}));
}
#[test]
fn exposes_less_escape_builtin_without_reentry_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@name: e(\"hello\"); @calc: e(\"calc(1px + 2px)\"); @min: e(\"min(1px, 2px)\"); @sign: e(\"sign(-2px)\"); .button { a: @name; b: @calc; c: @min; d: @sign; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 4);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 3);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("a: hello")
&& evaluation.evaluated_css.contains("b: calc(1px + 2px)")
&& evaluation.evaluated_css.contains("c: min(1px, 2px)")
&& evaluation.evaluated_css.contains("d: sign(-2px)")
}));
}
#[test]
fn exposes_less_url_escape_builtin_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@query: escape(\"a=1\"); @space: escape(\"hello world\"); @hash: escape(\"#fff\"); @unicode: escape(\"ä\"); @fn: escape(\"min(1px, 2px)\"); .button { a: @query; b: @space; c: @hash; d: @unicode; e: @fn; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 5);
assert_eq!(summary.native_resolved_value_count, 0);
assert_eq!(summary.native_raw_value_count, 5);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("a: a%3D1")
&& evaluation.evaluated_css.contains("b: hello%20world")
&& evaluation.evaluated_css.contains("c: %23fff")
&& evaluation.evaluated_css.contains("d: %C3%A4")
&& evaluation.evaluated_css.contains("e: min%281px,%202px%29")
}));
}
#[test]
fn exposes_less_type_predicate_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@number: isnumber(2px); @color: iscolor(red); @string: isstring(\"Roboto\"); @keyword: iskeyword(block); @url: isurl(url(\"a.png\")); @defined: isdefined(@color); @missing: isdefined(@absent); @literal: isdefined(red); @future-defined: isdefined(@future); @future: blue; @px: ispixel(2px); @pct: ispercentage(50%); @em: isem(1em); @unit-ok: isunit(1rem, rem); @unit-bad: isunit(1rem, px); .button { --number: @number; --color: @color; --string: @string; --keyword: @keyword; --url: @url; --defined: @defined; --missing: @missing; --literal: @literal; --future-defined: @future-defined; --px: @px; --pct: @pct; --em: @em; --unit-ok: @unit-ok; --unit-bad: @unit-bad; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 14);
assert_eq!(summary.native_resolved_value_count, 14);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("--number: true")
&& evaluation.evaluated_css.contains("--defined: true")
&& evaluation.evaluated_css.contains("--missing: false")
&& evaluation.evaluated_css.contains("--literal: true")
&& evaluation.evaluated_css.contains("--future-defined: true")
&& evaluation.evaluated_css.contains("--unit-ok: true")
&& evaluation.evaluated_css.contains("--unit-bad: false")
}));
}
#[test]
fn exposes_less_property_isdefined_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".button { color: red; @has-color: isdefined($color); @missing-prop: isdefined($missing); has: @has-color; missing: @missing-prop; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 2);
assert_eq!(summary.native_resolved_value_count, 2);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("color: red")
&& evaluation.evaluated_css.contains("has: true")
&& evaluation.evaluated_css.contains("missing: false")
}));
}
#[test]
fn exposes_less_property_variable_aliases_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".button { margin: (1px + 2px); color: red; @gap: $margin; @outline: 1px solid $color; padding: @gap; border: @outline; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 2);
assert_eq!(summary.native_resolved_value_count, 2);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("padding: 3px")
&& evaluation.evaluated_css.contains("border: 1px solid red")
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "@gap"
&& replacement.text == "3px"
&& replacement.abstract_value_kind == "exact"
})
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "@outline"
&& replacement.text == "1px solid red"
&& replacement.abstract_value_kind == "exact"
})
}));
}
#[test]
fn exposes_less_mixin_body_property_variables_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".space(@gap) { margin: @gap; padding: $margin; gap: $padding; } .button { .space(3px); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.native_structural_edit_count > 0);
assert!(summary.native_edit_output_matches_evaluated_css);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".space(@gap")
&& !evaluation.evaluated_css.contains(".space(3px")
&& !evaluation.evaluated_css.contains("$margin")
&& !evaluation.evaluated_css.contains("$padding")
&& evaluation.evaluated_css.contains("margin: 3px")
&& evaluation.evaluated_css.contains("padding: 3px")
&& evaluation.evaluated_css.contains("gap: 3px")
}));
}
#[test]
fn exposes_less_conditional_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@gap: 1; @a: if(@gap > 0, red, blue); @b: if(false, red, blue); @c: if(isnumber(2px), yes, no); @d: boolean(@gap > 0); @e: if(default(), red, blue); .button { a: @a; b: @b; c: @c; d: @d; e: @e; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 5);
assert_eq!(summary.native_resolved_value_count, 5);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("a: red")
&& evaluation.evaluated_css.contains("b: blue")
&& evaluation.evaluated_css.contains("c: yes")
&& evaluation.evaluated_css.contains("d: true")
&& evaluation.evaluated_css.contains("e: blue")
}));
}
#[test]
fn exposes_less_color_channel_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@color: #123456; @r: red(@color); @g: green(@color); @b: blue(@color); @a: alpha(rgba(10, 20, 30, .5)); .button { r: @r; g: @g; b: @b; a: @a; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 4);
assert_eq!(summary.native_resolved_value_count, 4);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("r: 18")
&& evaluation.evaluated_css.contains("g: 52")
&& evaluation.evaluated_css.contains("b: 86")
&& evaluation.evaluated_css.contains("a: 0.5")
}));
}
#[test]
fn exposes_less_rgb_color_constructors_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@rgb: rgb(18, 52, 86); @rgba: rgba(18, 52, 86, .5); @pct: rgba(100%, 0%, 0%, 50%); @slash: rgb(18 52 86 / .5); .button { color: @rgb; background: @rgba; border-color: @pct; outline-color: @slash; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 4);
assert_eq!(summary.native_resolved_value_count, 4);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("color: #123456")
&& evaluation
.evaluated_css
.contains("background: rgba(18, 52, 86, 0.5)")
&& evaluation
.evaluated_css
.contains("border-color: rgba(255, 0, 0, 0.5)")
&& evaluation
.evaluated_css
.contains("outline-color: rgba(18, 52, 86, 0.5)")
}));
}
#[test]
fn exposes_less_color_metadata_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@color: #123456; @h: hue(@color); @s: saturation(@color); @l: lightness(@color); @legacy: argb(rgba(18, 52, 86, .5)); .button { h: @h; s: @s; l: @l; legacy: @legacy; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 4);
assert_eq!(summary.native_resolved_value_count, 4);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("h: 210")
&& evaluation.evaluated_css.contains("s: 65.38461538%")
&& evaluation.evaluated_css.contains("l: 20.39215686%")
&& evaluation.evaluated_css.contains("legacy: #80123456")
}));
}
#[test]
fn exposes_less_hsv_color_metadata_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@hsv: hsv(210, 60%, 40%); @hsvUnitless: hsv(60, .6, .4); @hsva: hsva(210, 60%, 40%, 50%); @color: #123456; @h: hsvhue(@color); @s: hsvsaturation(@color); @v: hsvvalue(@color); @luma: luma(rgba(18, 52, 86, .5)); @lum: luminance(rgba(18, 52, 86, .5)); .button { hsv: @hsv; hsv-unitless: @hsvUnitless; hsva: @hsva; h: @h; s: @s; v: @v; luma: @luma; luminance: @lum; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 8);
assert_eq!(summary.native_resolved_value_count, 8);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("hsv: #294766")
&& evaluation.evaluated_css.contains("hsv-unitless: #666629")
&& evaluation
.evaluated_css
.contains("hsva: rgba(41, 71, 102, 0.5)")
&& evaluation.evaluated_css.contains("h: 210")
&& evaluation.evaluated_css.contains("s: 79.06976744%")
&& evaluation.evaluated_css.contains("v: 33.7254902%")
&& evaluation.evaluated_css.contains("luma: 1.62823344%")
&& evaluation.evaluated_css.contains("luminance: 9.26007843%")
}));
}
#[test]
fn exposes_less_contrast_and_color_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@dark: contrast(#123456); @light: contrast(#eeeeee); @custom: contrast(#123456, #111111, #eeeeee); @threshold: contrast(#888888, #111111, #eeeeee, 60%); @hex: color(\"#123456\"); @short: color(\"#abc\"); @alpha: color(\"#12345680\"); @kw: color(red); .button { dark: @dark; light: @light; custom: @custom; threshold: @threshold; hex: @hex; short: @short; alpha: @alpha; kw: @kw; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 8);
assert_eq!(summary.native_resolved_value_count, 8);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("dark: #ffffff")
&& evaluation.evaluated_css.contains("light: #000000")
&& evaluation.evaluated_css.contains("custom: #eeeeee")
&& evaluation.evaluated_css.contains("threshold: #eeeeee")
&& evaluation.evaluated_css.contains("hex: #123456")
&& evaluation.evaluated_css.contains("short: #abc")
&& evaluation.evaluated_css.contains("alpha: #12345680")
&& evaluation.evaluated_css.contains("kw: #ff0000")
}));
}
#[test]
fn exposes_less_alpha_transform_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@faded: fade(#123456, 50%); @raised: fadein(rgba(18, 52, 86, .5), 10%); @lowered: fadeout(rgba(18, 52, 86, .5), 10%); @raisedRel: fadein(rgba(18, 52, 86, .5), 10%, relative); @loweredRel: fadeout(rgba(18, 52, 86, .5), 10%, relative); @opaque: fadein(red, 10%); .button { a: @faded; b: @raised; c: @lowered; d: @opaque; e: @raisedRel; f: @loweredRel; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 6);
assert_eq!(summary.native_resolved_value_count, 6);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains("a: rgba(18, 52, 86, 0.5)")
&& evaluation
.evaluated_css
.contains("b: rgba(18, 52, 86, 0.6)")
&& evaluation
.evaluated_css
.contains("c: rgba(18, 52, 86, 0.4)")
&& evaluation.evaluated_css.contains("d: #ff0000")
&& evaluation
.evaluated_css
.contains("e: rgba(18, 52, 86, 0.55)")
&& evaluation
.evaluated_css
.contains("f: rgba(18, 52, 86, 0.45)")
}));
}
#[test]
fn exposes_less_hsl_color_transform_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@light: lighten(#123456, 10%); @dark: darken(#123456, 10%); @sat: saturate(#123456, 10%); @desat: desaturate(#123456, 10%); @lightRel: lighten(#123456, 10%, relative); @darkRel: darken(#123456, 10%, relative); @satRel: saturate(#123456, 10%, relative); @desatRel: desaturate(#123456, 10%, relative); @spin: spin(#123456, 10); @gray: greyscale(#123456); @alpha: lighten(rgba(18, 52, 86, .5), 10%); .button { light: @light; dark: @dark; sat: @sat; desat: @desat; light-rel: @lightRel; dark-rel: @darkRel; sat-rel: @satRel; desat-rel: @desatRel; spin: @spin; gray: @gray; alpha: @alpha; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 11);
assert_eq!(summary.native_resolved_value_count, 11);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("light: #1b4d80")
&& evaluation.evaluated_css.contains("dark: #091a2c")
&& evaluation.evaluated_css.contains("sat: #0d345b")
&& evaluation.evaluated_css.contains("desat: #173451")
&& evaluation.evaluated_css.contains("light-rel: #14395f")
&& evaluation.evaluated_css.contains("dark-rel: #102f4d")
&& evaluation.evaluated_css.contains("sat-rel: #0f3459")
&& evaluation.evaluated_css.contains("desat-rel: #153453")
&& evaluation.evaluated_css.contains("spin: #122956")
&& evaluation.evaluated_css.contains("gray: #343434")
&& evaluation
.evaluated_css
.contains("alpha: rgba(27, 77, 128, 0.5)")
}));
}
#[test]
fn exposes_less_color_mix_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@default: mix(red, blue); @weighted: mix(red, blue, 25%); @tinted: tint(#123456, 10%); @shaded: shade(#123456, 10%); @alpha: mix(rgba(255, 0, 0, .5), blue, 50%); @transparent: mix(transparent, red, 50%); .button { default: @default; weighted: @weighted; tinted: @tinted; shaded: @shaded; alpha: @alpha; transparent: @transparent; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 6);
assert_eq!(summary.native_resolved_value_count, 6);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("default: #800080")
&& evaluation.evaluated_css.contains("weighted: #4000bf")
&& evaluation.evaluated_css.contains("tinted: #2a4867")
&& evaluation.evaluated_css.contains("shaded: #102f4d")
&& evaluation
.evaluated_css
.contains("alpha: rgba(64, 0, 191, 0.75)")
&& evaluation
.evaluated_css
.contains("transparent: rgba(255, 0, 0, 0.5)")
}));
}
#[test]
fn exposes_less_color_blend_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@multiply: multiply(red, blue); @screen: screen(red, blue); @overlay: overlay(#123456, #abcdef); @softlight: softlight(#123456, #abcdef); @hardlight: hardlight(#123456, #abcdef); @difference: difference(#123456, #abcdef); @exclusion: exclusion(#123456, #abcdef); @average: average(#123456, #abcdef); @negation: negation(#123456, #abcdef); .button { multiply: @multiply; screen: @screen; overlay: @overlay; softlight: @softlight; hardlight: @hardlight; difference: @difference; exclusion: @exclusion; average: @average; negation: @negation; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 9);
assert_eq!(summary.native_resolved_value_count, 9);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("multiply: #000000")
&& evaluation.evaluated_css.contains("screen: #ff00ff")
&& evaluation.evaluated_css.contains("overlay: #1854a1")
&& evaluation.evaluated_css.contains("softlight: #205b8c")
&& evaluation.evaluated_css.contains("hardlight: #63afea")
&& evaluation.evaluated_css.contains("difference: #999999")
&& evaluation.evaluated_css.contains("exclusion: #a5ada4")
&& evaluation.evaluated_css.contains("average: #5f81a3")
&& evaluation.evaluated_css.contains("negation: #bdfdb9")
}));
}
#[test]
fn exposes_less_alpha_color_blend_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@multiply: multiply(rgba(255, 102, 0, .5), #0000ff); @screen: screen(rgba(255, 102, 0, .5), rgba(0, 0, 255, .25)); @overlay: overlay(rgba(255, 102, 0, .5), rgba(0, 0, 255, .25)); @softlight: softlight(rgba(255, 102, 0, .5), rgba(0, 0, 255, .25)); @hardlight: hardlight(rgba(255, 102, 0, .5), rgba(0, 0, 255, .25)); @difference: difference(rgba(255, 102, 0, .5), rgba(0, 0, 255, .25)); @exclusion: exclusion(rgba(255, 102, 0, .5), rgba(0, 0, 255, .25)); @average: average(rgba(255, 102, 0, .5), rgba(0, 0, 255, .25)); @negation: negation(rgba(255, 102, 0, .5), rgba(0, 0, 255, .25)); @both: multiply(transparent, transparent); @transparent: multiply(transparent, #0000ff); @sourceTransparent: screen(#ff6600, transparent); @transparentAverage: average(transparent, #ff6600); .button { multiply: @multiply; screen: @screen; overlay: @overlay; softlight: @softlight; hardlight: @hardlight; difference: @difference; exclusion: @exclusion; average: @average; negation: @negation; both: @both; transparent: @transparent; source-transparent: @sourceTransparent; transparent-average: @transparentAverage; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 13);
assert_eq!(summary.native_resolved_value_count, 13);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("multiply: #000080")
&& evaluation
.evaluated_css
.contains("screen: rgba(204, 82, 102, 0.625)")
&& evaluation
.evaluated_css
.contains("overlay: rgba(204, 61, 51, 0.625)")
&& evaluation
.evaluated_css
.contains("softlight: rgba(204, 69, 51, 0.625)")
&& evaluation
.evaluated_css
.contains("hardlight: rgba(153, 61, 102, 0.625)")
&& evaluation
.evaluated_css
.contains("difference: rgba(204, 82, 102, 0.625)")
&& evaluation
.evaluated_css
.contains("exclusion: rgba(204, 82, 102, 0.625)")
&& evaluation
.evaluated_css
.contains("average: rgba(179, 71, 77, 0.625)")
&& evaluation
.evaluated_css
.contains("negation: rgba(204, 82, 102, 0.625)")
&& evaluation.evaluated_css.contains("both: rgba(0, 0, 0, 0)")
&& evaluation.evaluated_css.contains("transparent: #0000ff")
&& evaluation
.evaluated_css
.contains("source-transparent: #ff6600")
&& evaluation
.evaluated_css
.contains("transparent-average: #ff6600")
}));
}
#[test]
fn exposes_less_list_builtins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@items: a b c; @comma: a, b, c; @len1: length(@items); @len2: length(@comma); @x1: extract(@items, 2); @x2: extract(@comma, 3); .button { len1: @len1; len2: @len2; x1: @x1; x2: @x2; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 4);
assert_eq!(summary.native_resolved_value_count, 4);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("len1: 3")
&& evaluation.evaluated_css.contains("len2: 3")
&& evaluation.evaluated_css.contains("x1: b")
&& evaluation.evaluated_css.contains("x2: c")
}));
}
#[test]
fn exposes_less_range_builtin_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@items: range(4); @gaps: range(1px, 5px, 2); @half: range(1, 2, .5); @empty: range(3, 1); .button { a: @items; b: @gaps; c: @half; d: @empty; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 4);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("a: 1 2 3 4")
&& evaluation.evaluated_css.contains("b: 1px 3px 5px")
&& evaluation.evaluated_css.contains("c: 1 1.5 2")
&& evaluation.evaluated_css.contains("d: ;")
}));
}
#[test]
fn exposes_less_replace_builtin_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@name: replace(\"hello world\", \"world\", \"less\"); @first: replace(\"hello\", \"l\", \"L\"); @all: replace(\"hello\", \"l\", \"L\", \"g\"); @fold: replace(\"ABCabc\", \"abc\", \"x\", \"gi\"); @bare: replace(hello, l, X); .button { name: @name; first: @first; all: @all; fold: @fold; bare: @bare; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 5);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("name: \"hello less\"")
&& evaluation.evaluated_css.contains("first: \"heLlo\"")
&& evaluation.evaluated_css.contains("all: \"heLLo\"")
&& evaluation.evaluated_css.contains("fold: \"xx\"")
&& evaluation.evaluated_css.contains("bare: heXlo")
}));
}
#[test]
fn exposes_less_format_builtin_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@name: %(\"hello %s\", \"less\"); @num: %(\"%dpx\", 12); @encoded: %(\"%S\", \"x y\"); @literal: %(\"%% done\"); @missing: %(\"%s %s\", alpha); @extra: %(\"%s\", beta, ignored); @escaped: %(~\"hello-%s\", less); .button { name: @name; num: @num; encoded: @encoded; literal: @literal; missing: @missing; extra: @extra; escaped: @escaped; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 7);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("name: \"hello less\"")
&& evaluation.evaluated_css.contains("num: \"12px\"")
&& evaluation.evaluated_css.contains("encoded: \"x%20y\"")
&& evaluation.evaluated_css.contains("literal: \"% done\"")
&& evaluation.evaluated_css.contains("missing: \"alpha %s\"")
&& evaluation.evaluated_css.contains("extra: \"beta\"")
&& evaluation.evaluated_css.contains("escaped: hello-less")
}));
}
#[test]
fn exposes_less_isruleset_builtin_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@rules: { color: red; }; @ok: isruleset(@rules); @bad: isruleset(red); .button { ok: @ok; bad: @bad; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 2);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("ok: true")
&& evaluation.evaluated_css.contains("bad: false")
}));
}
#[test]
fn exposes_less_static_mixin_evaluator_oracle_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@brand: red; .tone(@color, @gap: 1px) { color: @color; margin: @gap; padding: @brand; } .button { .tone(blue, 2px); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.product_output_source, "nativeEditOutput");
assert!(summary.legacy_output_retained_as_oracle);
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".tone(@color")
&& !evaluation.evaluated_css.contains(".tone(blue")
&& evaluation.evaluated_css.contains("color: blue")
&& evaluation.evaluated_css.contains("margin: 2px")
&& evaluation.evaluated_css.contains("padding: red")
}));
}
#[test]
fn exposes_less_named_mixin_arguments_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tone(@color, @gap: 1px) { color: @color; margin: @gap; } .button { .tone(@gap: 2px, @color: blue); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".tone(@color")
&& !evaluation.evaluated_css.contains(".tone(@gap")
&& evaluation.evaluated_css.contains("color: blue")
&& evaluation.evaluated_css.contains("margin: 2px")
}));
}
#[test]
fn exposes_less_semicolon_named_mixin_arguments_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tone(@color; @gap: 1px) { color: @color; margin: @gap; } .button { .tone(@gap: 2px; @color: blue); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".tone(@color")
&& !evaluation.evaluated_css.contains(".tone(@gap")
&& evaluation.evaluated_css.contains("color: blue")
&& evaluation.evaluated_css.contains("margin: 2px")
}));
}
#[test]
fn exposes_less_variadic_mixin_arguments_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".shadow(@color; @rest...) { color: @color; box-shadow: @rest; trace: @arguments; } .button { .shadow(red; 1px, 2px, 3px); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".shadow(@color")
&& !evaluation.evaluated_css.contains(".shadow(red")
&& evaluation.evaluated_css.contains("color: red")
&& evaluation
.evaluated_css
.contains("box-shadow: 1px, 2px, 3px")
&& evaluation
.evaluated_css
.contains("trace: red, 1px, 2px, 3px")
}));
}
#[test]
fn exposes_less_mixin_accessors_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tokens(@color, @gap: 1px) { @result: @color; width: @gap; } .button { color: .tokens(red)[@result]; margin: .tokens(red, 2px)[width]; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".tokens(@color")
&& !evaluation.evaluated_css.contains(".tokens(red)[@result]")
&& !evaluation
.evaluated_css
.contains(".tokens(red, 2px)[width]")
&& evaluation.evaluated_css.contains("color: red")
&& evaluation.evaluated_css.contains("margin: 2px")
}));
}
#[test]
fn exposes_less_unknown_mixin_accessor_members_as_preserved_oracle_output_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tokens(@color) { @result: @color; } .button { color: .tokens(red)[@missing]; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains(".tokens(red)[@missing]")
&& evaluation.evaluated_css.contains("@result: @color")
}));
}
#[test]
fn exposes_less_unknown_mixin_accessor_property_members_as_preserved_oracle_output_through_query_boundary()
{
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tokens(@color) { result: @color; } .button { color: .tokens(red)[missing]; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains(".tokens(red)[missing]")
&& evaluation.evaluated_css.contains("result: @color")
}));
}
#[test]
fn exposes_less_unknown_detached_ruleset_accessor_members_as_preserved_oracle_output_through_query_boundary()
{
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@tokens: { primary: red; }; .button { color: @tokens[missing]; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("@tokens[missing]")
&& evaluation
.evaluated_css
.contains("@tokens: { primary: red; };")
}));
}
#[test]
fn exposes_less_detached_ruleset_accessor_property_scope_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@tokens: { @gap: 2px; padding: @gap; gap: $padding; }; .button { padding: 4px; inset: @tokens[gap]; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("@tokens:")
&& !evaluation.evaluated_css.contains("@tokens[gap]")
&& evaluation.evaluated_css.contains("padding: 4px")
&& evaluation.evaluated_css.contains("inset: 4px")
&& !evaluation.evaluated_css.contains("inset: 2px")
}));
}
#[test]
fn exposes_less_detached_ruleset_accessor_missing_property_scope_as_preserved_oracle_output() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@tokens: { margin: 2px; padding: $margin; }; .button { gap: @tokens[padding]; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_edit_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains("@tokens: { margin: 2px; padding: $margin; };")
&& evaluation.evaluated_css.contains("@tokens[padding]")
&& !evaluation.evaluated_css.contains("gap: 2px")
}));
}
#[test]
fn exposes_less_unknown_detached_ruleset_mixin_calls_as_preserved_oracle_output_through_query_boundary()
{
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@rules: { .unknown(); }; .button { @rules(); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains("@rules: { .unknown(); };")
&& evaluation.evaluated_css.contains("@rules();")
}));
}
#[test]
fn exposes_less_namespace_mixins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"#bundle() { .rounded(@radius) { border-radius: @radius; } } .button { #bundle > .rounded(2px); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("#bundle()")
&& !evaluation.evaluated_css.contains("#bundle > .rounded")
&& evaluation.evaluated_css.contains("border-radius: 2px")
}));
}
#[test]
fn exposes_less_parameterized_namespace_mixins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"#bundle(@color) { .tone() { color: @color; } } .button { #bundle(red) > .tone(); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("#bundle(@color")
&& !evaluation.evaluated_css.contains("#bundle(red) > .tone")
&& evaluation.evaluated_css.contains("color: red")
}));
}
#[test]
fn exposes_less_unbound_parameterized_namespace_mixins_as_preserved_oracle_output_through_query_boundary()
{
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"#bundle(@color) { .tone() { color: @color; } } .button { #bundle > .tone(); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("#bundle > .tone();")
&& evaluation.evaluated_css.contains("#bundle(@color)")
&& !evaluation.evaluated_css.contains(".button { color:")
}));
}
#[test]
fn exposes_less_namespace_local_detached_rulesets_as_preserved_oracle_output() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"#bundle() { @tokens: { color: red; }; .tone() { color: @tokens[color]; } } .button { #bundle > .tone(); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert_eq!(summary.native_edit_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains("@tokens: { color: red; };")
&& evaluation.evaluated_css.contains("@tokens[color]")
&& !evaluation.evaluated_css.contains(".button { color: red")
}));
}
#[test]
fn exposes_less_literal_pattern_mixins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tone(dark, @color) { color: @color; background: black; } .tone(light, @color) { color: @color; background: white; } .button { .tone(dark, red); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".tone(dark")
&& !evaluation.evaluated_css.contains(".tone(light")
&& evaluation.evaluated_css.contains("color: red")
&& evaluation.evaluated_css.contains("background: black")
&& !evaluation.evaluated_css.contains("background: white")
}));
}
#[test]
fn exposes_less_unmatched_literal_pattern_mixins_as_preserved_oracle_output_through_query_boundary()
{
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tone(dark, @color) { color: @color; background: black; } .button { .tone(light, red); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains(".tone(light, red);")
&& evaluation.evaluated_css.contains(".tone(dark, @color)")
&& !evaluation.evaluated_css.contains(".button { color: red")
}));
}
#[test]
fn exposes_less_important_mixins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tone(@color, @gap: 1px) { color: @color; margin: @gap; } .button { .tone(red, 2px) !important; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".tone(@color")
&& !evaluation.evaluated_css.contains(".tone(red")
&& evaluation.evaluated_css.contains("color: red !important")
&& evaluation.evaluated_css.contains("margin: 2px !important")
}));
}
#[test]
fn exposes_less_unknown_mixin_call_suffixes_as_preserved_oracle_output_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tone(@color) { color: @color; } .button { .tone(red) !default; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains(".tone(red) !default;")
&& evaluation.evaluated_css.contains(".tone(@color)")
&& !evaluation.evaluated_css.contains(".button { color: red")
}));
}
#[test]
fn exposes_less_default_guarded_mixins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tone(@color) when (@color = red) { color: @color; } .tone(@color) when (default()) and (iscolor(@color)) { color: gray; } .button { .tone(blue); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".tone(@color")
&& !evaluation.evaluated_css.contains(".tone(blue")
&& evaluation.evaluated_css.contains("color: gray")
&& !evaluation.evaluated_css.contains("color: blue")
}));
}
#[test]
fn exposes_less_ambiguous_default_guarded_mixins_as_preserved_output_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@gap: 1px; .tone() when (default()) { color: red; } .tone() when not(default()) { color: blue; } .button { margin: @gap; .tone(); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains(".tone() when (default())")
&& evaluation
.evaluated_css
.contains(".tone() when not(default())")
&& evaluation
.evaluated_css
.contains(".button { margin: 1px; .tone(); }")
&& !evaluation
.evaluated_css
.contains(".button { margin: 1px; color: red; }")
&& !evaluation
.evaluated_css
.contains(".button { margin: 1px; color: blue; }")
}));
}
#[test]
fn exposes_less_decidable_negated_default_guarded_mixins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tone() when (default()) and (iscolor(red)) { color: red; } .tone() when not(default()) and (iscolor(1px)) { color: blue; } .button { .tone(); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains("color: red")
&& !evaluation.evaluated_css.contains("color: blue")
&& !evaluation.evaluated_css.contains(".tone()")
&& !evaluation.evaluated_css.contains("not(default())")
}));
}
#[test]
fn exposes_less_ruleset_guarded_mixin_oracle_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".apply(@block) when (isruleset(@block)) { @block(); } @rules: { color: red; margin: 1px; }; .button { .apply(@rules); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".apply(@block")
&& !evaluation.evaluated_css.contains("@rules:")
&& !evaluation.evaluated_css.contains(".apply(@rules")
&& evaluation.evaluated_css.contains("color: red")
&& evaluation.evaluated_css.contains("margin: 1px")
}));
}
#[test]
fn exposes_less_isdefined_guarded_mixin_oracle_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@brand: red; .present() when (isdefined(@brand)) { color: @brand; } .with-param(@tone) when (isdefined(@tone)) { border-color: @tone; } .button { .present(); .with-param(green); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".present()")
&& !evaluation.evaluated_css.contains(".with-param(green")
&& evaluation.evaluated_css.contains("color: red")
&& evaluation.evaluated_css.contains("border-color: green")
}));
}
#[test]
fn exposes_less_property_isdefined_guarded_mixin_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".present() when (isdefined($color)) { border-color: $color; } .button { color: red; .present(); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".present()")
&& evaluation.evaluated_css.contains("color: red")
&& evaluation.evaluated_css.contains("border-color: red")
}));
}
#[test]
fn exposes_static_scss_while_argument_returns_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@function pick($target) { $i: 0; @while $i < 3 { @if $i == $target { @return $i + 1; } $i: $i + 1; } @return 0; } .button { z-index: pick(2); }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains(".button { z-index: 3; }")
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "function:pick"
&& replacement.text == "3"
&& replacement.abstract_value_kind == "exact"
})
}));
}
#[test]
fn exposes_less_property_guarded_mixins_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".space() when (isnumber($margin)) { padding: $margin; } .tone() when (iscolor($color)) { border-color: $color; } .unit() when (isunit($gap, px)) { inset: $gap; } .button { margin: (1px + 2px); color: red; gap: 4px; .space(); .tone(); .unit(); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".space()")
&& !evaluation.evaluated_css.contains(".tone()")
&& !evaluation.evaluated_css.contains(".unit()")
&& evaluation.evaluated_css.contains("padding: 3px")
&& evaluation.evaluated_css.contains("border-color: red")
&& evaluation.evaluated_css.contains("inset: 4px")
}));
}
#[test]
fn exposes_less_future_property_guarded_mixins_as_native_output_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".space() when (isnumber($margin)) { padding: $margin; } .button { .space(); margin: 2px; }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "less");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.native_structural_edit_count > 0);
assert!(summary.native_edit_output_matches_evaluated_css);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".space() when")
&& !evaluation.evaluated_css.contains(".space();")
&& evaluation.evaluated_css.contains("padding: 2px")
&& evaluation.evaluated_css.contains("margin: 2px")
}));
}
#[test]
fn exposes_less_false_guarded_mixins_as_removed_output_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
".tone() when (iscolor(1px)) { color: red; } .button { .tone(); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.native_structural_edit_count > 0);
assert!(summary.native_edit_output_matches_evaluated_css);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains(".tone();")
&& !evaluation.evaluated_css.contains("when (iscolor(1px))")
&& !evaluation.evaluated_css.contains("color: 1px")
}));
}
#[test]
fn exposes_less_false_type_predicate_guarded_mixins_as_removed_output_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
r#".number(@value) when (isnumber(@value)) { margin: @value; }
.ratio(@value) when (ispercentage(@value)) { width: @value; }
.font(@value) when (isstring(@value)) { font-family: @value; }
.display(@value) when (iskeyword(@value)) { display: @value; }
.asset(@value) when (isurl(@value)) { background-image: @value; }
.em(@value) when (isem(@value)) { letter-spacing: @value; }
.button { .number(red); .ratio(2px); .font(block); .display("Roboto"); .asset(red); .em(1rem); }"#,
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.native_structural_edit_count > 0);
assert!(summary.native_edit_output_matches_evaluated_css);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
[
".number(red)",
".ratio(2px)",
".font(block)",
r#".display("Roboto")"#,
".asset(red)",
".em(1rem)",
".number(@value)",
".ratio(@value)",
".font(@value)",
".display(@value)",
".asset(@value)",
".em(@value)",
"margin: red",
"width: 2px",
"font-family: block",
r#"display: "Roboto""#,
"background-image: red",
"letter-spacing: 1rem",
]
.into_iter()
.all(|snippet| !evaluation.evaluated_css.contains(snippet))
}));
}
#[test]
fn exposes_less_false_guarded_namespace_mixins_as_removed_output_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"#bundle() when (iscolor(1px)) { .tone() { color: red; } } .button { #bundle > .tone(); }",
OmenaParserStyleDialect::Less,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert!(summary.evaluation_available);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 0);
assert!(summary.native_structural_edit_count > 0);
assert!(summary.native_edit_output_matches_evaluated_css);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
!evaluation.evaluated_css.contains("#bundle > .tone();")
&& !evaluation.evaluated_css.contains("when (iscolor(1px))")
&& !evaluation.evaluated_css.contains(".button { color: red")
}));
}
#[test]
fn exposes_static_scss_for_loop_returns_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@function pick($target) { @for $i from 1 through 3 { @if $i == $target { @return $i; } } @return 0; } .button { z-index: pick(2); }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation.evaluated_css.contains(".button { z-index: 2; }")
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "function:pick"
&& replacement.text == "2"
&& replacement.abstract_value_kind == "exact"
})
}));
}
#[test]
fn exposes_static_scss_each_loop_returns_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@function tone($target) { @each $name, $color in (primary: red, secondary: blue) { @if $name == $target { @return $color; } } @return black; } .button { color: tone(secondary); }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains(".button { color: blue; }")
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "function:tone"
&& replacement.text == "blue"
&& replacement.abstract_value_kind == "exact"
})
}));
}
#[test]
fn exposes_static_scss_each_function_source_returns_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@function pick($target) { @each $item in list.append(1px 2px, 3px) { @if $item == $target { @return $item; } } @return 0px; } .button { margin: pick(3px); }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains(".button { margin: 3px; }")
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "function:pick"
&& replacement.text == "3px"
&& replacement.abstract_value_kind == "exact"
})
}));
}
#[test]
fn exposes_static_scss_each_tuple_function_source_returns_through_query_boundary() {
let summary = summarize_omena_query_static_stylesheet_evaluator_from_source(
"@function width-for($target) { @each $width, $style in list.zip(1px 2px, solid dashed) { @if $style == $target { @return $width; } } @return 0px; } .button { margin: width-for(dashed); }",
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.static-stylesheet-evaluator");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(!summary.legacy_output_consumed_until_cutover);
assert_eq!(summary.divergence_count, 0);
assert!(summary.all_legacy_declaration_values_preserved);
assert_eq!(summary.native_replacement_count, 1);
assert_eq!(summary.native_resolved_value_count, 1);
assert_eq!(summary.native_raw_value_count, 0);
assert_eq!(summary.native_top_value_count, 0);
assert!(summary.evaluation.as_ref().is_some_and(|evaluation| {
evaluation
.evaluated_css
.contains(".button { margin: 2px; }")
&& evaluation.resolved_replacements.iter().any(|replacement| {
replacement.name == "function:width-for"
&& replacement.text == "2px"
&& replacement.abstract_value_kind == "exact"
})
}));
}
#[test]
fn exposes_scss_evaluator_control_flow_oracle_through_query_boundary() {
let source = r#"
$enabled: true;
@if $enabled {
.on { color: green; }
} @else {
@if true {
.off { color: red; }
}
}
@function space($input) {
@return $input + 1px;
}
.card { margin: space(2px); }
"#;
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "scss");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert!(summary.flat_css_cfg_built);
assert!(!summary.merged_cross_file_graph);
assert!(summary.control_flow_ir.is_some());
assert!(summary.value_analysis.is_some());
assert!(summary.prune_reachability.is_some());
assert!(summary.call_return_ir.is_some());
assert!(summary.control_flow_branch_block_count >= 1);
assert!(summary.call_return_node_count >= 3);
assert!(summary.call_resolved_return_value_count >= 1);
assert!(summary.exact_call_resolved_return_value_count >= 1);
assert!(summary.value_analysis_converged);
assert!(summary.prune_reachability_available);
assert!(summary.prune_reachability_converged);
assert!(summary.prune_reachability_flat_css_cfg_built);
assert!(summary.prune_reachability_have_terminals_changed);
assert!(summary.prune_reachability_reachable_block_count > 0);
assert!(summary.prune_reachability_unreachable_block_count > 0);
assert!(
summary
.ready_surfaces
.contains(&"scssEvaluatorControlFlowValueAnalysis")
);
assert!(
summary
.ready_surfaces
.contains(&"scssEvaluatorControlFlowPruneReachability")
);
if let Some(control_flow) = summary.control_flow_ir.as_ref() {
assert_eq!(control_flow.node_key_type, STABLE_NODE_KEY_TYPE_LABEL_V0);
assert!(control_flow.flat_css_cfg_built);
assert!(!control_flow.merged_cross_file_graph);
}
if let Some(value_analysis) = summary.value_analysis.as_ref() {
assert_eq!(value_analysis.value_type, "AbstractCssValueV0");
assert!(value_analysis.flat_css_cfg_built);
assert!(!value_analysis.merged_cross_file_graph);
}
if let Some(prune_reachability) = summary.prune_reachability.as_ref() {
assert_eq!(
prune_reachability.product,
"omena-scss-eval.control-flow-prune-reachability"
);
assert!(prune_reachability.flat_css_cfg_built);
assert!(!prune_reachability.merged_cross_file_graph);
assert!(prune_reachability.converged);
}
if let Some(call_return) = summary.call_return_ir.as_ref() {
assert_eq!(call_return.node_key_type, STABLE_NODE_KEY_TYPE_LABEL_V0);
assert!(!call_return.flat_css_cfg_built);
assert!(!call_return.merged_cross_file_graph);
}
}
#[test]
fn exposes_sass_while_control_flow_through_query_boundary() {
let source = r#"
$i: 0
@while $i < 3
$i: $i + 1
.n
order: $i
"#;
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "sass");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert!(summary.flat_css_cfg_built);
assert!(!summary.merged_cross_file_graph);
assert!(summary.control_flow_ir.is_some());
assert!(summary.value_analysis.is_some());
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert!(summary.value_analysis_converged);
}
#[test]
fn exposes_sass_function_return_control_flow_through_query_boundary() {
let source = r#"
@function pick($target)
@for $i from 1 through 3
@if $i == $target
@return $i
@return 0
.button
z-index: pick(2)
"#;
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "sass");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert!(summary.flat_css_cfg_built);
assert!(!summary.merged_cross_file_graph);
assert!(summary.control_flow_ir.is_some());
assert!(summary.value_analysis.is_some());
assert!(summary.call_return_ir.is_some());
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert_eq!(summary.call_resolved_return_value_count, 1);
assert_eq!(summary.exact_call_resolved_return_value_count, 1);
assert!(summary.value_analysis_converged);
}
#[test]
fn exposes_mixin_body_control_flow_through_query_boundary() -> Result<(), serde_json::Error> {
let scss_branch_source = r#"
@mixin tone($enabled) {
@if $enabled { color: red; }
@else { color: blue; }
}
.button { @include tone(false); }
"#;
let scss_branch = summarize_omena_query_scss_evaluator_control_flow_from_source(
scss_branch_source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(scss_branch.schema_version, "0");
assert_eq!(
scss_branch.product,
"omena-query.scss-evaluator-control-flow"
);
assert_eq!(scss_branch.mode, "oracleOnly");
assert_eq!(scss_branch.value_type, "AbstractCssValueV0");
assert!(scss_branch.supported_dialect);
assert!(scss_branch.flat_css_cfg_built);
assert!(!scss_branch.merged_cross_file_graph);
assert_eq!(scss_branch.control_flow_branch_block_count, 2);
assert_eq!(scss_branch.call_return_edge_count, 1);
assert!(scss_branch.value_analysis_converged);
let Some(call_return) = scss_branch.call_return_ir.as_ref() else {
return Ok(());
};
let mixin_declaration = call_return
.nodes
.iter()
.find(|node| node.kind == "mixinDeclaration" && node.name.as_deref() == Some("tone"));
assert!(mixin_declaration.is_some());
let Some(mixin_declaration) = mixin_declaration else {
return Ok(());
};
assert!(mixin_declaration.body_has_control_flow);
assert!(!mixin_declaration.body_has_loop_control_flow);
let sass_loop_source = r#"
@mixin items()
@for $i from 1 through 3
order: $i
.button
@include items()
"#;
let sass_loop = summarize_omena_query_scss_evaluator_control_flow_from_source(
sass_loop_source,
OmenaParserStyleDialect::Sass,
);
assert_eq!(sass_loop.schema_version, "0");
assert_eq!(sass_loop.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(sass_loop.mode, "oracleOnly");
assert_eq!(sass_loop.dialect, "sass");
assert_eq!(sass_loop.value_type, "AbstractCssValueV0");
assert!(sass_loop.supported_dialect);
assert!(sass_loop.flat_css_cfg_built);
assert!(!sass_loop.merged_cross_file_graph);
assert_eq!(sass_loop.control_flow_loop_block_count, 1);
assert_eq!(sass_loop.control_flow_back_edge_count, 1);
assert_eq!(sass_loop.call_return_edge_count, 1);
assert!(sass_loop.value_analysis_converged);
let Some(call_return) = sass_loop.call_return_ir.as_ref() else {
return Ok(());
};
let mixin_declaration = call_return
.nodes
.iter()
.find(|node| node.kind == "mixinDeclaration" && node.name.as_deref() == Some("items"));
assert!(mixin_declaration.is_some());
let Some(mixin_declaration) = mixin_declaration else {
return Ok(());
};
assert!(mixin_declaration.body_has_control_flow);
assert!(mixin_declaration.body_has_loop_control_flow);
let Some(value_analysis) = sass_loop.value_analysis.as_ref() else {
return Ok(());
};
let loop_block = value_analysis
.blocks
.iter()
.find(|block| block.loop_carried_bindings == vec!["$i"]);
assert!(loop_block.is_some());
let Some(loop_block) = loop_block else {
return Ok(());
};
assert_eq!(
serde_json::to_value(&loop_block.loop_carried_binding_values[0].value)?,
serde_json::json!({
"kind": "finiteSet",
"values": ["1", "2", "3"],
})
);
Ok(())
}
#[test]
fn exposes_sass_static_while_finite_set_bound_bindings_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = r#"
@each $limit in 2, 4
$i: 0
@while $i < $limit
$i: $i + 1
.n
order: $i
"#;
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "sass");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 2);
assert_eq!(summary.control_flow_back_edge_count, 2);
assert!(summary.value_analysis_converged);
assert!(summary.value_analysis.is_some());
let Some(value_analysis) = summary.value_analysis.as_ref() else {
return Ok(());
};
let while_block = value_analysis
.blocks
.iter()
.find(|block| block.loop_carried_bindings == vec!["$i"]);
assert!(while_block.is_some());
let Some(while_block) = while_block else {
return Ok(());
};
assert_eq!(
serde_json::to_value(&while_block.loop_carried_binding_values[0].value)?,
serde_json::json!({
"kind": "finiteSet",
"values": ["0", "1", "2", "3"],
})
);
Ok(())
}
#[test]
fn exposes_sass_static_for_finite_set_bound_bindings_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = r#"
@each $end in 2, 4
@for $i from 1 through $end
.n
order: $i
"#;
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Sass,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.dialect, "sass");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 2);
assert_eq!(summary.control_flow_back_edge_count, 2);
assert!(summary.value_analysis_converged);
assert!(summary.value_analysis.is_some());
let Some(value_analysis) = summary.value_analysis.as_ref() else {
return Ok(());
};
let for_block = value_analysis
.blocks
.iter()
.find(|block| block.loop_carried_bindings == vec!["$i"]);
assert!(for_block.is_some());
let Some(for_block) = for_block else {
return Ok(());
};
assert_eq!(
serde_json::to_value(&for_block.loop_carried_binding_values[0].value)?,
serde_json::json!({
"kind": "finiteSet",
"values": ["1", "2", "3", "4"],
})
);
Ok(())
}
#[test]
fn exposes_static_while_bindings_through_query_boundary() -> Result<(), serde_json::Error> {
let source = "$i: 0; @while $i < 3 { $i: $i + 1; .n { order: $i; } }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert!(summary.value_analysis_converged);
assert!(summary.value_analysis.is_some());
let Some(value_analysis) = summary.value_analysis.as_ref() else {
return Ok(());
};
assert_eq!(value_analysis.blocks[0].loop_carried_bindings, vec!["$i"]);
assert_eq!(
serde_json::to_value(&value_analysis.blocks[0].loop_carried_binding_values[0].value)?,
serde_json::json!({
"kind": "finiteSet",
"values": ["0", "1", "2"],
})
);
Ok(())
}
#[test]
fn exposes_static_while_bound_variable_bindings_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = "$end: 3; $i: 0; @while $i < $end { $i: $i + 1; .n { order: $i; } }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert!(summary.value_analysis_converged);
assert!(summary.value_analysis.is_some());
let Some(value_analysis) = summary.value_analysis.as_ref() else {
return Ok(());
};
assert_eq!(value_analysis.blocks[0].loop_carried_bindings, vec!["$i"]);
assert_eq!(
serde_json::to_value(&value_analysis.blocks[0].loop_carried_binding_values[0].value)?,
serde_json::json!({
"kind": "finiteSet",
"values": ["0", "1", "2"],
})
);
Ok(())
}
#[test]
fn exposes_static_while_finite_set_bound_bindings_through_query_boundary()
-> Result<(), serde_json::Error> {
let source =
"@each $limit in 2, 4 { $i: 0; @while $i < $limit { $i: $i + 1; .n { order: $i; } } }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 2);
assert_eq!(summary.control_flow_back_edge_count, 2);
assert!(summary.value_analysis_converged);
assert!(summary.value_analysis.is_some());
let Some(value_analysis) = summary.value_analysis.as_ref() else {
return Ok(());
};
let while_block = value_analysis
.blocks
.iter()
.find(|block| block.loop_carried_bindings == vec!["$i"]);
assert!(while_block.is_some());
let Some(while_block) = while_block else {
return Ok(());
};
assert_eq!(
serde_json::to_value(&while_block.loop_carried_binding_values[0].value)?,
serde_json::json!({
"kind": "finiteSet",
"values": ["0", "1", "2", "3"],
})
);
Ok(())
}
#[test]
fn exposes_static_for_finite_set_bound_bindings_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = "@each $end in 2, 4 { @for $i from 1 through $end { .n { order: $i; } } }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 2);
assert_eq!(summary.control_flow_back_edge_count, 2);
assert!(summary.value_analysis_converged);
assert!(summary.value_analysis.is_some());
let Some(value_analysis) = summary.value_analysis.as_ref() else {
return Ok(());
};
let for_block = value_analysis
.blocks
.iter()
.find(|block| block.loop_carried_bindings == vec!["$i"]);
assert!(for_block.is_some());
let Some(for_block) = for_block else {
return Ok(());
};
assert_eq!(
serde_json::to_value(&for_block.loop_carried_binding_values[0].value)?,
serde_json::json!({
"kind": "finiteSet",
"values": ["1", "2", "3", "4"],
})
);
Ok(())
}
#[test]
fn exposes_static_while_call_return_values_through_query_boundary() -> Result<(), serde_json::Error>
{
let source = "@function collect() { $i: 0; @while $i < 3 { @return $i; $i: $i + 1; } } .a { width: collect(); }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert_eq!(summary.call_resolved_return_value_count, 1);
assert_eq!(summary.exact_call_resolved_return_value_count, 0);
assert!(summary.call_return_ir.is_some());
let Some(call_return) = summary.call_return_ir.as_ref() else {
return Ok(());
};
let function_call = call_return
.nodes
.iter()
.find(|node| node.kind == "functionCall" && node.name.as_deref() == Some("collect"));
assert!(function_call.is_some());
let Some(function_call) = function_call else {
return Ok(());
};
assert_eq!(
function_call.call_resolved_return_value_kind,
Some("finiteSet")
);
assert_eq!(
serde_json::to_value(function_call.call_resolved_return_value.as_ref())?,
serde_json::json!({
"kind": "finiteSet",
"values": ["0", "1", "2"],
})
);
Ok(())
}
#[test]
fn exposes_static_while_conditional_call_return_values_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = "@function collect() { $i: 0; @while $i < 3 { @if $i == 2 { @return $i; } $i: $i + 1; } @return 0; } .a { width: collect(); }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert_eq!(summary.call_resolved_return_value_count, 1);
assert_eq!(summary.exact_call_resolved_return_value_count, 1);
assert!(summary.call_return_ir.is_some());
let Some(call_return) = summary.call_return_ir.as_ref() else {
return Ok(());
};
let function_call = call_return
.nodes
.iter()
.find(|node| node.kind == "functionCall" && node.name.as_deref() == Some("collect"));
assert!(function_call.is_some());
let Some(function_call) = function_call else {
return Ok(());
};
assert_eq!(function_call.call_resolved_return_value_kind, Some("exact"));
assert_eq!(
serde_json::to_value(function_call.call_resolved_return_value.as_ref())?,
serde_json::json!({
"kind": "exact",
"value": "2",
})
);
Ok(())
}
#[test]
fn exposes_static_while_expression_step_call_return_values_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = "@function collect() { $step: 1 + 1; $i: 0; @while $i < 6 { @if $i == 4 { @return $i; } $i: $i + $step; } @return 9; } .a { width: collect(); }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert_eq!(summary.call_resolved_return_value_count, 1);
assert_eq!(summary.exact_call_resolved_return_value_count, 1);
assert!(summary.call_return_ir.is_some());
let Some(call_return) = summary.call_return_ir.as_ref() else {
return Ok(());
};
let function_call = call_return
.nodes
.iter()
.find(|node| node.kind == "functionCall" && node.name.as_deref() == Some("collect"));
assert!(function_call.is_some());
let Some(function_call) = function_call else {
return Ok(());
};
assert_eq!(function_call.call_resolved_return_value_kind, Some("exact"));
assert_eq!(
serde_json::to_value(function_call.call_resolved_return_value.as_ref())?,
serde_json::json!({
"kind": "exact",
"value": "4",
})
);
Ok(())
}
#[test]
fn exposes_static_for_conditional_call_return_values_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = "@function collect($target) { @for $i from 1 through 3 { @if $i == $target { @return $i; } } @return 0; } .a { width: collect(2); }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert_eq!(summary.call_resolved_return_value_count, 1);
assert_eq!(summary.exact_call_resolved_return_value_count, 1);
assert!(summary.call_return_ir.is_some());
let Some(call_return) = summary.call_return_ir.as_ref() else {
return Ok(());
};
let function_call = call_return
.nodes
.iter()
.find(|node| node.kind == "functionCall" && node.name.as_deref() == Some("collect"));
assert!(function_call.is_some());
let Some(function_call) = function_call else {
return Ok(());
};
assert_eq!(function_call.call_resolved_return_value_kind, Some("exact"));
assert_eq!(
serde_json::to_value(function_call.call_resolved_return_value.as_ref())?,
serde_json::json!({
"kind": "exact",
"value": "2",
})
);
Ok(())
}
#[test]
fn exposes_descending_static_for_conditional_call_return_values_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = "@function collect($target) { @for $i from 3 through 1 { @if $i == $target { @return $i; } } @return 0; } .a { width: collect(2); }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert_eq!(summary.call_resolved_return_value_count, 1);
assert_eq!(summary.exact_call_resolved_return_value_count, 1);
assert!(summary.call_return_ir.is_some());
let Some(call_return) = summary.call_return_ir.as_ref() else {
return Ok(());
};
let function_call = call_return
.nodes
.iter()
.find(|node| node.kind == "functionCall" && node.name.as_deref() == Some("collect"));
assert!(function_call.is_some());
let Some(function_call) = function_call else {
return Ok(());
};
assert_eq!(function_call.call_resolved_return_value_kind, Some("exact"));
assert_eq!(
serde_json::to_value(function_call.call_resolved_return_value.as_ref())?,
serde_json::json!({
"kind": "exact",
"value": "2",
})
);
Ok(())
}
#[test]
fn exposes_static_for_expression_bound_call_return_values_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = "@function collect($target) { @for $i from 1 + 1 through 1 + 2 { @if $i == $target { @return $i; } } @return 0; } .a { width: collect(1); }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert_eq!(summary.call_resolved_return_value_count, 1);
assert_eq!(summary.exact_call_resolved_return_value_count, 1);
assert!(summary.call_return_ir.is_some());
let Some(call_return) = summary.call_return_ir.as_ref() else {
return Ok(());
};
let function_call = call_return
.nodes
.iter()
.find(|node| node.kind == "functionCall" && node.name.as_deref() == Some("collect"));
assert!(function_call.is_some());
let Some(function_call) = function_call else {
return Ok(());
};
assert_eq!(function_call.call_resolved_return_value_kind, Some("exact"));
assert_eq!(
serde_json::to_value(function_call.call_resolved_return_value.as_ref())?,
serde_json::json!({
"kind": "exact",
"value": "0",
})
);
Ok(())
}
#[test]
fn exposes_static_each_conditional_call_return_values_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = "@function tone($target) { @each $name, $tone in (primary: red, secondary: blue) { @if $name == $target { @return $tone; } } @return black; } .a { color: tone(secondary); }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert_eq!(summary.call_resolved_return_value_count, 1);
assert_eq!(summary.exact_call_resolved_return_value_count, 1);
assert!(summary.call_return_ir.is_some());
let Some(call_return) = summary.call_return_ir.as_ref() else {
return Ok(());
};
let function_call = call_return
.nodes
.iter()
.find(|node| node.kind == "functionCall" && node.name.as_deref() == Some("tone"));
assert!(function_call.is_some());
let Some(function_call) = function_call else {
return Ok(());
};
assert_eq!(function_call.call_resolved_return_value_kind, Some("exact"));
assert_eq!(
serde_json::to_value(function_call.call_resolved_return_value.as_ref())?,
serde_json::json!({
"kind": "exact",
"value": "#00f",
})
);
Ok(())
}
#[test]
fn exposes_static_each_function_source_call_return_values_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = "@function pick($target) { @each $item in list.append(1px 2px, 3px) { @if $item == $target { @return $item; } } @return 0px; } .a { margin: pick(3px); }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert_eq!(summary.call_resolved_return_value_count, 1);
assert_eq!(summary.exact_call_resolved_return_value_count, 1);
assert!(summary.call_return_ir.is_some());
let Some(call_return) = summary.call_return_ir.as_ref() else {
return Ok(());
};
let function_call = call_return
.nodes
.iter()
.find(|node| node.kind == "functionCall" && node.name.as_deref() == Some("pick"));
assert!(function_call.is_some());
let Some(function_call) = function_call else {
return Ok(());
};
assert_eq!(function_call.call_resolved_return_value_kind, Some("exact"));
assert_eq!(
serde_json::to_value(function_call.call_resolved_return_value.as_ref())?,
serde_json::json!({
"kind": "exact",
"value": "3px",
})
);
Ok(())
}
#[test]
fn exposes_static_each_tuple_function_source_call_return_values_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = "@function width-for($target) { @each $width, $style in list.zip(1px 2px, solid dashed) { @if $style == $target { @return $width; } } @return 0px; } .a { margin: width-for(dashed); }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert_eq!(summary.call_resolved_return_value_count, 1);
assert_eq!(summary.exact_call_resolved_return_value_count, 1);
assert!(summary.call_return_ir.is_some());
let Some(call_return) = summary.call_return_ir.as_ref() else {
return Ok(());
};
let function_call = call_return
.nodes
.iter()
.find(|node| node.kind == "functionCall" && node.name.as_deref() == Some("width-for"));
assert!(function_call.is_some());
let Some(function_call) = function_call else {
return Ok(());
};
assert_eq!(function_call.call_resolved_return_value_kind, Some("exact"));
assert_eq!(
serde_json::to_value(function_call.call_resolved_return_value.as_ref())?,
serde_json::json!({
"kind": "exact",
"value": "2px",
})
);
Ok(())
}
#[test]
fn keeps_dynamic_loop_call_return_values_top_through_query_boundary()
-> Result<(), serde_json::Error> {
let source = "@function collect($count) { @for $i from 1 through $count { @return $i; } } .a { width: collect(var(--count)); }";
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.mode, "oracleOnly");
assert_eq!(summary.value_type, "AbstractCssValueV0");
assert!(summary.supported_dialect);
assert_eq!(summary.control_flow_loop_block_count, 1);
assert_eq!(summary.control_flow_back_edge_count, 1);
assert_eq!(summary.call_resolved_return_value_count, 1);
assert_eq!(summary.exact_call_resolved_return_value_count, 0);
assert!(summary.call_return_ir.is_some());
let Some(call_return) = summary.call_return_ir.as_ref() else {
return Ok(());
};
assert_eq!(call_return.top_call_resolved_return_value_count, 1);
let function_call = call_return
.nodes
.iter()
.find(|node| node.kind == "functionCall" && node.name.as_deref() == Some("collect"));
assert!(function_call.is_some());
let Some(function_call) = function_call else {
return Ok(());
};
assert_eq!(function_call.call_resolved_return_value_kind, Some("top"));
assert_eq!(
serde_json::to_value(function_call.call_resolved_return_value.as_ref())?,
serde_json::json!({
"kind": "top",
})
);
Ok(())
}
#[test]
fn keeps_plain_css_out_of_scss_evaluator_control_flow_oracle() {
let summary = summarize_omena_query_scss_evaluator_control_flow_from_source(
".card { color: red; }",
OmenaParserStyleDialect::Css,
);
assert_eq!(summary.product, "omena-query.scss-evaluator-control-flow");
assert_eq!(summary.dialect, "css");
assert!(!summary.supported_dialect);
assert_eq!(summary.control_flow_block_count, 0);
assert_eq!(summary.call_return_node_count, 0);
assert!(!summary.value_analysis_converged);
assert!(summary.control_flow_ir.is_none());
assert!(summary.value_analysis.is_none());
assert!(summary.call_return_ir.is_none());
}
#[test]
fn exposes_native_css_evaluator_surfaces_through_query_boundary() {
let source = r#"
@function --gap(--size <length>: 1rem) returns <length> {
result: var(--size);
}
.card {
gap: --gap(2rem);
display: if(supports(display: grid): grid; else: block);
margin: if(media(width >= 1px): 1rem; else: 2rem);
}
"#;
let summary = summarize_omena_query_native_css_evaluator_from_source(
source,
OmenaParserStyleDialect::Css,
);
assert_eq!(summary.schema_version, "0");
assert_eq!(summary.product, "omena-query.native-css-evaluator");
assert_eq!(summary.mode, "oracleOnlyPruneButKeep");
assert_eq!(summary.dialect, "css");
assert!(summary.supported_dialect);
assert_eq!(
summary.native_static_eval_spec_snapshot,
"css-values-5-if-css-mixins-1-function-ed-2026-06-22"
);
assert_eq!(
summary.native_static_eval_opt_in_policy,
"explicit-pass-id-required-default-consumer-build-excludes"
);
assert_eq!(summary.native_static_eval_dialect_restriction, "css-only");
assert!(summary.native_static_eval_explicit_opt_in_required);
assert!(summary.native_function_surface_available);
assert!(summary.if_function_decision_available);
assert_eq!(summary.native_function_count, 1);
assert_eq!(summary.native_function_parameter_count, 1);
assert_eq!(summary.native_function_typed_parameter_count, 1);
assert_eq!(summary.native_function_result_count, 1);
assert!(summary.native_function_call_evaluation_available);
assert_eq!(summary.native_function_call_count, 1);
assert_eq!(summary.native_function_call_foldable_count, 1);
assert_eq!(summary.native_function_call_preserved_count, 0);
assert_eq!(summary.native_function_call_structural_error_count, 0);
assert_eq!(summary.native_function_call_missing_result_count, 0);
assert!(summary.native_static_edit_plan_available);
assert_eq!(summary.native_static_edit_count, 2);
assert!(summary.native_static_edit_output_changed);
assert_eq!(summary.if_function_count, 2);
assert_eq!(summary.if_function_foldable_count, 1);
assert_eq!(summary.if_function_preserved_count, 1);
assert_eq!(summary.if_function_static_supports_branch_count, 1);
assert_eq!(summary.if_function_runtime_branch_count, 1);
assert!(
summary
.ready_surfaces
.contains(&"nativeCssIfFunctionDecisionSurface")
);
assert!(
summary
.ready_surfaces
.contains(&"nativeCssFunctionCallEvaluationSurface")
);
assert!(
summary
.ready_surfaces
.contains(&"nativeCssStaticEditPlanSurface")
);
assert!(
summary
.native_function_surface
.as_ref()
.is_some_and(|surface| surface.functions[0].name == "--gap")
);
assert!(
summary
.native_function_call_evaluations
.as_ref()
.is_some_and(|surface| {
surface.calls[0].decision == "foldToStaticValue"
&& surface.calls[0].evaluated_value.as_deref() == Some("2rem")
})
);
assert!(
summary
.native_static_edit_plan
.as_ref()
.is_some_and(|plan| {
plan.edited_css.contains("gap: 2rem")
&& plan.edited_css.contains("display: grid")
&& plan.edited_css.contains("margin: if(media")
})
);
assert!(
summary
.if_function_decisions
.as_ref()
.is_some_and(|surface| {
surface.functions.iter().any(|function| {
function.decision == "foldToStaticValue"
&& function.selected_value.as_deref() == Some("grid")
}) && surface
.functions
.iter()
.any(|function| function.decision == "preserveVerbatim")
})
);
}
#[test]
fn exposes_native_css_function_type_mismatch_through_query_boundary() {
let source = r#"
@function --tone(--size <length>) returns <color> {
result: var(--size);
}
.card {
color: --tone(2rem);
}
"#;
let summary = summarize_omena_query_native_css_evaluator_from_source(
source,
OmenaParserStyleDialect::Css,
);
assert_eq!(summary.product, "omena-query.native-css-evaluator");
assert_eq!(summary.native_function_call_count, 1);
assert_eq!(summary.native_function_call_foldable_count, 0);
assert_eq!(summary.native_function_call_structural_error_count, 1);
assert_eq!(summary.native_static_edit_count, 0);
assert!(!summary.native_static_edit_output_changed);
assert!(
summary
.native_function_call_evaluations
.as_ref()
.is_some_and(|surface| {
surface.calls[0].decision == "structuralError"
&& surface.calls[0].reason == "result value does not match return syntax"
})
);
}
#[test]
fn exposes_native_css_function_cycle_through_query_boundary() {
let source =
"@function --loop() returns <length> { result: --loop(); } .card { width: --loop(); }";
let summary = summarize_omena_query_native_css_evaluator_from_source(
source,
OmenaParserStyleDialect::Css,
);
assert_eq!(summary.product, "omena-query.native-css-evaluator");
assert!(summary.native_function_call_count >= 1);
assert_eq!(summary.native_function_call_foldable_count, 0);
assert!(summary.native_function_call_structural_error_count >= 1);
assert_eq!(summary.native_static_edit_count, 0);
assert!(!summary.native_static_edit_output_changed);
assert!(
summary
.native_function_call_evaluations
.as_ref()
.is_some_and(|surface| {
surface.calls[0].decision == "structuralError"
&& surface.calls[0].reason
== "function result call graph contains a guaranteed cycle"
})
);
}
#[test]
fn exposes_native_css_function_body_call_preservation_through_query_boundary() {
let source = "@function --inner() returns <length> { result: 1px; } @function --outer() returns <length> { result: --inner(); } .card { width: --inner(); }";
let summary = summarize_omena_query_native_css_evaluator_from_source(
source,
OmenaParserStyleDialect::Css,
);
assert_eq!(summary.product, "omena-query.native-css-evaluator");
assert_eq!(summary.native_function_call_foldable_count, 2);
assert_eq!(summary.native_static_edit_count, 1);
assert!(summary.native_static_edit_output_changed);
assert!(
summary
.native_static_edit_plan
.as_ref()
.is_some_and(|plan| {
plan.edited_css.contains("result: --inner();")
&& plan.edited_css.contains("width: 1px")
})
);
}
#[test]
fn exposes_native_css_evaluator_surfaces_through_engine_input_boundary() -> Result<(), String> {
let source = ".card { display: if(supports(display: grid): grid; else: block); }";
let input = EngineInputV2 {
version: "native-css-evaluator-engine-input-v0".to_string(),
sources: Vec::new(),
styles: vec![StyleAnalysisInputV2 {
file_path: "/tmp/Card.module.css".to_string(),
source: Some(source.to_string()),
document: StyleDocumentV2 {
selectors: Vec::new(),
},
}],
type_facts: Vec::new(),
};
let summary = summarize_omena_query_native_css_evaluator_from_engine_input(
&input,
"/tmp/Card.module.css",
)
.ok_or_else(|| "missing native CSS evaluator summary".to_string())?;
assert_eq!(summary.product, "omena-query.native-css-evaluator");
assert_eq!(summary.dialect, "css");
assert_eq!(summary.if_function_count, 1);
assert_eq!(summary.if_function_foldable_count, 1);
Ok(())
}
#[test]
fn keeps_scss_out_of_native_css_evaluator_surface() {
let source = ".card { width: if(true, 1px, 2px); }";
let summary = summarize_omena_query_native_css_evaluator_from_source(
source,
OmenaParserStyleDialect::Scss,
);
assert_eq!(summary.product, "omena-query.native-css-evaluator");
assert_eq!(summary.dialect, "scss");
assert!(!summary.supported_dialect);
assert!(!summary.native_function_surface_available);
assert!(!summary.if_function_decision_available);
assert_eq!(summary.native_function_count, 0);
assert_eq!(summary.if_function_count, 0);
assert!(summary.native_function_surface.is_none());
assert!(summary.if_function_decisions.is_none());
}