@@ -1582,6 +1582,102 @@ mod viewport_arity_validation {
15821582 }
15831583}
15841584
1585+ // ============================================================================
1586+ // Tests: hydrate trigger validation
1587+ // Mirrors the `hydrate` error cases in Angular's r3_template_transform_spec.ts.
1588+ // ============================================================================
1589+
1590+ mod hydrate_trigger_validation {
1591+ use super :: * ;
1592+
1593+ #[ test]
1594+ fn should_report_parameter_passed_to_hydrate_trigger_with_reference_based_equivalent ( ) {
1595+ let errors = get_transform_errors (
1596+ "@defer (on interaction(button); hydrate on interaction(button)) {hello}" ,
1597+ ) ;
1598+ assert ! (
1599+ errors
1600+ . iter( )
1601+ . any( |e| e. contains( "Hydration trigger \" interaction\" cannot have parameters" ) ) ,
1602+ "Expected a hydrate interaction parameter error, got: {errors:?}"
1603+ ) ;
1604+ }
1605+
1606+ #[ test]
1607+ fn should_not_report_missing_reference_on_hydrate_trigger ( ) {
1608+ let errors = get_transform_errors ( "@defer (on immediate; hydrate on viewport) {hello}" ) ;
1609+ assert ! ( errors. is_empty( ) , "Expected no errors, got: {errors:?}" ) ;
1610+ }
1611+
1612+ #[ test]
1613+ fn should_report_never_trigger_used_without_hydrate ( ) {
1614+ for template in [
1615+ "@defer (on immediate; never) {hello}" ,
1616+ "@defer (on immediate; prefetch never) {hello}" ,
1617+ ] {
1618+ let errors = get_transform_errors ( template) ;
1619+ assert ! (
1620+ errors. iter( ) . any( |e| e. contains( "Unrecognized trigger" ) ) ,
1621+ "Expected an unrecognized trigger error for {template}, got: {errors:?}"
1622+ ) ;
1623+ }
1624+ }
1625+
1626+ #[ test]
1627+ fn should_report_hydrate_never_used_with_additional_characters ( ) {
1628+ let errors = get_transform_errors ( "@defer (hydrate never, and thank you) {hello}" ) ;
1629+ assert ! (
1630+ errors. iter( ) . any( |e| e. contains( "Unrecognized trigger" ) ) ,
1631+ "Expected an unrecognized trigger error, got: {errors:?}"
1632+ ) ;
1633+ }
1634+
1635+ #[ test]
1636+ fn should_not_report_an_error_when_hydrate_never_is_used_with_additional_blocks ( ) {
1637+ let errors = get_transform_errors ( "@defer (hydrate never; on idle;) {hello}" ) ;
1638+ assert ! (
1639+ !errors. iter( ) . any( |e| e. contains( "Unrecognized trigger" ) ) ,
1640+ "Expected no unrecognized trigger error, got: {errors:?}"
1641+ ) ;
1642+ }
1643+
1644+ #[ test]
1645+ fn should_not_report_an_error_when_hydrate_never_is_used_with_spaces ( ) {
1646+ let errors = get_transform_errors ( "@defer(hydrate never ; on idle ;) {hello}" ) ;
1647+ assert ! (
1648+ !errors. iter( ) . any( |e| e. contains( "Unrecognized trigger" ) ) ,
1649+ "Expected no unrecognized trigger error, got: {errors:?}"
1650+ ) ;
1651+ }
1652+
1653+ #[ test]
1654+ fn should_not_report_an_error_when_hydrate_never_is_used_after_another_block ( ) {
1655+ let errors =
1656+ get_transform_errors ( "@defer(\n on idle;\n hydrate never) {hello}" ) ;
1657+ assert ! (
1658+ !errors. iter( ) . any( |e| e. contains( "Unrecognized trigger" ) ) ,
1659+ "Expected no unrecognized trigger error, got: {errors:?}"
1660+ ) ;
1661+ }
1662+
1663+ #[ test]
1664+ fn should_report_when_hydrate_never_is_used_together_with_another_hydrate_trigger ( ) {
1665+ // Extra trigger after and before `hydrate never`.
1666+ for template in [
1667+ "@defer (hydrate never; hydrate when shouldHydrate()) {hello}" ,
1668+ "@defer (hydrate when shouldHydrate(); hydrate never) {hello}" ,
1669+ ] {
1670+ let errors = get_transform_errors ( template) ;
1671+ assert ! (
1672+ errors. iter( ) . any( |e| e. contains(
1673+ "Cannot specify additional `hydrate` triggers if `hydrate never` is present"
1674+ ) ) ,
1675+ "Expected a hydrate never conflict error for {template}, got: {errors:?}"
1676+ ) ;
1677+ }
1678+ }
1679+ }
1680+
15851681// ============================================================================
15861682// Tests: @for error cascade (Finding #4)
15871683// Angular only reports the parse-expression error for `@for (x of ) {}`,
0 commit comments