Make WordPress Core


Ignore:
Timestamp:
10/21/2025 12:07:16 PM (4 months ago)
Author:
luisherranz
Message:

Interactivity API: Support unique IDs in server-side directives processing.

Server-side logic to support unique IDs in the Interactivity API directives to match what the client is doing (https://github.com/WordPress/gutenberg/pull/72161).

Props santosguillamot, darerodz, luisherranz.
Fixes #64106.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/interactivity-api/wpInteractivityAPI.php

    r61019 r61020  
    379379                // Multiple evaluations should be serialized only once.
    380380                $this->set_internal_namespace_stack( 'pluginWithInvokedDerivedState' );
    381                 $this->evaluate( 'state.derivedProp' );
    382                 $this->evaluate( 'state.derivedProp' );
    383                 $this->evaluate( 'state.nested.derivedProp' );
    384                 $this->evaluate( 'state.nested.derivedProp' );
     381                $this->evaluate(
     382                    array(
     383                        'namespace' => 'pluginWithInvokedDerivedState',
     384                        'value'     => 'state.derivedProp',
     385                    )
     386                );
     387                $this->evaluate(
     388                    array(
     389                        'namespace' => 'pluginWithInvokedDerivedState',
     390                        'value'     => 'state.derivedProp',
     391                    )
     392                );
     393                $this->evaluate(
     394                    array(
     395                        'namespace' => 'pluginWithInvokedDerivedState',
     396                        'value'     => 'state.nested.derivedProp',
     397                    )
     398                );
     399                $this->evaluate(
     400                    array(
     401                        'namespace' => 'pluginWithInvokedDerivedState',
     402                        'value'     => 'state.nested.derivedProp',
     403                    )
     404                );
    385405
    386406                // Only the path part that points to a derived state prop should be serialized.
    387407                $this->set_internal_namespace_stack( 'pluginWithInvokedDerivedStateReturningArray' );
    388                 $this->evaluate( 'state.nested.derivedProp.prop' );
     408                $this->evaluate(
     409                    array(
     410                        'namespace' => 'pluginWithInvokedDerivedStateReturningArray',
     411                        'value'     => 'state.nested.derivedProp',
     412                    )
     413                );
    389414            }
    390415        );
     
    820845     * name.
    821846     *
    822      * @ticket 60356
    823      *
    824      * @covers ::extract_prefix_and_suffix
    825      */
    826     public function test_extract_prefix_and_suffix() {
    827         $extract_prefix_and_suffix = new ReflectionMethod( $this->interactivity, 'extract_prefix_and_suffix' );
     847     * @ticket 64106
     848     *
     849     * @covers ::parse_directive_name
     850     */
     851    public function test_parse_directive_name() {
     852        $parse_directive_name = new ReflectionMethod( $this->interactivity, 'parse_directive_name' );
    828853        if ( PHP_VERSION_ID < 80100 ) {
    829             $extract_prefix_and_suffix->setAccessible( true );
     854            $parse_directive_name->setAccessible( true );
    830855        }
    831856
    832         $result = $extract_prefix_and_suffix->invoke( $this->interactivity, 'data-wp-interactive' );
    833         $this->assertSame( array( 'data-wp-interactive' ), $result );
    834 
    835         $result = $extract_prefix_and_suffix->invoke( $this->interactivity, 'data-wp-bind--src' );
    836         $this->assertSame( array( 'data-wp-bind', 'src' ), $result );
    837 
    838         $result = $extract_prefix_and_suffix->invoke( $this->interactivity, 'data-wp-foo--and--bar' );
    839         $this->assertSame( array( 'data-wp-foo', 'and--bar' ), $result );
     857        // Should parse directives without suffix or unique ID.
     858        $result = $parse_directive_name->invoke( $this->interactivity, 'data-wp-test' );
     859        $this->assertSame( 'test', $result['prefix'] );
     860        $this->assertNull( $result['suffix'] );
     861        $this->assertNull( $result['unique_id'] );
     862
     863        // Should parse directives with suffix only.
     864        $result = $parse_directive_name->invoke( $this->interactivity, 'data-wp-test--one' );
     865        $this->assertSame( 'test', $result['prefix'] );
     866        $this->assertSame( 'one', $result['suffix'] );
     867        $this->assertNull( $result['unique_id'] );
     868
     869        // Should parse directives with unique ID only.
     870        $result = $parse_directive_name->invoke( $this->interactivity, 'data-wp-test---unique-id' );
     871        $this->assertSame( 'test', $result['prefix'] );
     872        $this->assertNull( $result['suffix'] );
     873        $this->assertSame( 'unique-id', $result['unique_id'] );
     874
     875        // Should parse directives with suffix and unique ID.
     876        $result = $parse_directive_name->invoke( $this->interactivity, 'data-wp-test--suffix---unique-id' );
     877        $this->assertSame( 'test', $result['prefix'] );
     878        $this->assertSame( 'suffix', $result['suffix'] );
     879        $this->assertSame( 'unique-id', $result['unique_id'] );
     880
     881        // Should handle empty suffix (just two dashes).
     882        $result = $parse_directive_name->invoke( $this->interactivity, 'data-wp-test--' );
     883        $this->assertSame( 'test', $result['prefix'] );
     884        $this->assertNull( $result['suffix'] );
     885        $this->assertNull( $result['unique_id'] );
     886
     887        // Should handle empty unique ID (just three dashes).
     888        $result = $parse_directive_name->invoke( $this->interactivity, 'data-wp-test---' );
     889        $this->assertSame( 'test', $result['prefix'] );
     890        $this->assertNull( $result['suffix'] );
     891        $this->assertNull( $result['unique_id'] );
     892
     893        // Should handle only dashes (4 or more dashes).
     894        $result = $parse_directive_name->invoke( $this->interactivity, 'data-wp-test----' );
     895        $this->assertSame( 'test', $result['prefix'] );
     896        $this->assertSame( '--', $result['suffix'] );
     897        $this->assertNull( $result['unique_id'] );
     898
     899        // Should handle suffix starting with 4 or more dashes but containing valid characters.
     900        $result = $parse_directive_name->invoke( $this->interactivity, 'data-wp-test------custom-suffix' );
     901        $this->assertSame( 'test', $result['prefix'] );
     902        $this->assertSame( '----custom-suffix', $result['suffix'] );
     903        $this->assertNull( $result['unique_id'] );
     904
     905        // Should handle complex pattern with multiple dashes.
     906        $result = $parse_directive_name->invoke( $this->interactivity, 'data-wp-test--complex--suffix---complex--unique---id' );
     907        $this->assertSame( 'test', $result['prefix'] );
     908        $this->assertSame( 'complex--suffix', $result['suffix'] );
     909        $this->assertSame( 'complex--unique---id', $result['unique_id'] );
     910
     911        // Should handle suffix with dashes followed by unique ID.
     912        $result = $parse_directive_name->invoke( $this->interactivity, 'data-wp-test----suffix---unique-id' );
     913        $this->assertSame( 'test', $result['prefix'] );
     914        $this->assertSame( '--suffix', $result['suffix'] );
     915        $this->assertSame( 'unique-id', $result['unique_id'] );
     916
     917        // Should handle unique IDs followed by suffix in wrong order.
     918        $result = $parse_directive_name->invoke( $this->interactivity, 'data-wp-test---unique-id--wrong-suffix' );
     919        $this->assertSame( 'test', $result['prefix'] );
     920        $this->assertNull( $result['suffix'] );
     921        $this->assertSame( 'unique-id--wrong-suffix', $result['unique_id'] );
     922    }
     923
     924    /**
     925     * Tests the ability to get the valid entries of a specific directive in an HTML element.
     926     *
     927     * @ticket 64106
     928     *
     929     * @covers ::get_directive_entries
     930     */
     931    public function test_get_directive_entries() {
     932        $get_directive_entries = new ReflectionMethod( $this->interactivity, 'get_directive_entries' );
     933        if ( PHP_VERSION_ID < 80100 ) {
     934            $get_directive_entries->setAccessible( true );
     935        }
     936        $this->set_internal_namespace_stack( 'myPlugin' );
     937
     938        // Should process simple directives.
     939        $html = '<div data-wp-test="test value"></div>';
     940        $p    = new WP_Interactivity_API_Directives_Processor( $html );
     941        $p->next_tag();
     942        $results = $get_directive_entries->invoke( $this->interactivity, $p, 'test' );
     943        $this->assertCount( 1, $results );
     944        $result = $results[0];
     945        $this->assertSame( 'myPlugin', $result['namespace'] );
     946        $this->assertSame( 'test value', $result['value'] );
     947        $this->assertNull( $result['suffix'] );
     948        $this->assertNull( $result['unique_id'] );
     949
     950        // Should process directives without value.
     951        $html = '<div data-wp-test></div>';
     952        $p    = new WP_Interactivity_API_Directives_Processor( $html );
     953        $p->next_tag();
     954        $results = $get_directive_entries->invoke( $this->interactivity, $p, 'test' );
     955        $this->assertNull( $results[0]['value'] );
     956
     957        // Should parse JSON values in directives.
     958        $html = '<div data-wp-test=\'{"key": "value"}\'></div>';
     959        $p    = new WP_Interactivity_API_Directives_Processor( $html );
     960        $p->next_tag();
     961        $results = $get_directive_entries->invoke( $this->interactivity, $p, 'test' );
     962        $this->assertSame( array( 'key' => 'value' ), $results[0]['value'] );
     963
     964        // Should handle malformed JSON and keep as string.
     965        $html = '<div data-wp-test="{malformed: json}"></div>';
     966        $p    = new WP_Interactivity_API_Directives_Processor( $html );
     967        $p->next_tag();
     968        $results = $get_directive_entries->invoke( $this->interactivity, $p, 'test' );
     969        $this->assertSame( '{malformed: json}', $results[0]['value'] );
     970
     971        // Should process directives with a custom namespace.
     972        $html = '<div data-wp-test="my-namespace::test value"></div>';
     973        $p    = new WP_Interactivity_API_Directives_Processor( $html );
     974        $p->next_tag();
     975        $results = $get_directive_entries->invoke( $this->interactivity, $p, 'test' );
     976        $this->assertSame( 'my-namespace', $results[0]['namespace'] );
     977        $this->assertSame( 'test value', $results[0]['value'] );
     978
     979        // Should parse JSON values with a custom namespace.
     980        $html = '<div data-wp-test=\'my-namespace::{"key": "value"}\'></div>';
     981        $p    = new WP_Interactivity_API_Directives_Processor( $html );
     982        $p->next_tag();
     983        $results = $get_directive_entries->invoke( $this->interactivity, $p, 'test' );
     984        $this->assertSame( 'my-namespace', $results[0]['namespace'] );
     985        $this->assertSame( array( 'key' => 'value' ), $results[0]['value'] );
     986
     987        // Should handle multiple directives with different unique IDs.
     988        $html = '
     989            <div
     990                data-wp-test---plugin-a="value-a"
     991                data-wp-test---plugin-b="value-b"
     992                data-wp-test---plugin-c="value-c"
     993            ></div>';
     994        $p    = new WP_Interactivity_API_Directives_Processor( $html );
     995        $p->next_tag();
     996        $results = $get_directive_entries->invoke( $this->interactivity, $p, 'test' );
     997        $this->assertCount( 3, $results );
     998        $this->assertSame(
     999            array(
     1000                'namespace' => 'myPlugin',
     1001                'value'     => 'value-a',
     1002                'suffix'    => null,
     1003                'unique_id' => 'plugin-a',
     1004            ),
     1005            $results[0]
     1006        );
     1007        $this->assertSame(
     1008            array(
     1009                'namespace' => 'myPlugin',
     1010                'value'     => 'value-b',
     1011                'suffix'    => null,
     1012                'unique_id' => 'plugin-b',
     1013            ),
     1014            $results[1]
     1015        );
     1016        $this->assertSame(
     1017            array(
     1018                'namespace' => 'myPlugin',
     1019                'value'     => 'value-c',
     1020                'suffix'    => null,
     1021                'unique_id' => 'plugin-c',
     1022            ),
     1023            $results[2]
     1024        );
     1025
     1026        // Should handle mix of different suffixes and unique IDs.
     1027        $html = '
     1028            <div
     1029                data-wp-test--suffix-a---id-1="value1"
     1030                data-wp-test--suffix-a---id-2="value2"
     1031                data-wp-test--suffix-b---id-1="value3"
     1032                data-wp-test--suffix-c---id-1="value4"
     1033            ></div>';
     1034        $p    = new WP_Interactivity_API_Directives_Processor( $html );
     1035        $p->next_tag();
     1036        $results = $get_directive_entries->invoke( $this->interactivity, $p, 'test' );
     1037        $this->assertCount( 4, $results );
     1038        $this->assertSame(
     1039            array(
     1040                'namespace' => 'myPlugin',
     1041                'value'     => 'value1',
     1042                'suffix'    => 'suffix-a',
     1043                'unique_id' => 'id-1',
     1044            ),
     1045            $results[0]
     1046        );
     1047        $this->assertSame(
     1048            array(
     1049                'namespace' => 'myPlugin',
     1050                'value'     => 'value2',
     1051                'suffix'    => 'suffix-a',
     1052                'unique_id' => 'id-2',
     1053            ),
     1054            $results[1]
     1055        );
     1056        $this->assertSame(
     1057            array(
     1058                'namespace' => 'myPlugin',
     1059                'value'     => 'value3',
     1060                'suffix'    => 'suffix-b',
     1061                'unique_id' => 'id-1',
     1062            ),
     1063            $results[2]
     1064        );
     1065        $this->assertSame(
     1066            array(
     1067                'namespace' => 'myPlugin',
     1068                'value'     => 'value4',
     1069                'suffix'    => 'suffix-c',
     1070                'unique_id' => 'id-1',
     1071            ),
     1072            $results[3]
     1073        );
     1074
     1075        // Should handle unique ID with namespace.
     1076        $html = '<div data-wp-test---unique-id="my-namespace::test value"></div>';
     1077        $p    = new WP_Interactivity_API_Directives_Processor( $html );
     1078        $p->next_tag();
     1079        $results = $get_directive_entries->invoke( $this->interactivity, $p, 'test' );
     1080        $this->assertSame( 'my-namespace', $results[0]['namespace'] );
     1081        $this->assertSame( 'test value', $results[0]['value'] );
     1082        $this->assertSame( 'unique-id', $results[0]['unique_id'] );
     1083
     1084        // Should handle multiple directives with different namespaces and unique IDs.
     1085        $html = '
     1086            <div
     1087                data-wp-test---id-a="namespace-a::value1"
     1088                data-wp-test---id-b="namespace-b::value2"
     1089            ></div>';
     1090        $p    = new WP_Interactivity_API_Directives_Processor( $html );
     1091        $p->next_tag();
     1092        $results = $get_directive_entries->invoke( $this->interactivity, $p, 'test' );
     1093        $this->assertCount( 2, $results );
     1094        $this->assertSame(
     1095            array(
     1096                'namespace' => 'namespace-a',
     1097                'value'     => 'value1',
     1098                'suffix'    => null,
     1099                'unique_id' => 'id-a',
     1100            ),
     1101            $results[0]
     1102        );
     1103        $this->assertSame(
     1104            array(
     1105                'namespace' => 'namespace-b',
     1106                'value'     => 'value2',
     1107                'suffix'    => null,
     1108                'unique_id' => 'id-b',
     1109            ),
     1110            $results[1]
     1111        );
     1112        // Should sort directives by suffix and uniqueId for stable ordering.
     1113        $html = '
     1114            <div
     1115                data-wp-test---z
     1116                data-wp-test---a
     1117                data-wp-test--b---z
     1118                data-wp-test--b---a
     1119                data-wp-test--a
     1120                data-wp-test
     1121            ></div>';
     1122        $p    = new WP_Interactivity_API_Directives_Processor( $html );
     1123        $p->next_tag();
     1124        $results = $get_directive_entries->invoke( $this->interactivity, $p, 'test' );
     1125        $this->assertCount( 6, $results );
     1126        $this->assertEquals(
     1127            array(
     1128                array( null, null ),
     1129                array( null, 'a' ),
     1130                array( null, 'z' ),
     1131                array( 'a', null ),
     1132                array( 'b', 'a' ),
     1133                array( 'b', 'z' ),
     1134            ),
     1135            array_map(
     1136                function ( $d ) {
     1137                    return array( $d['suffix'], $d['unique_id'] );
     1138                },
     1139                $results
     1140            )
     1141        );
    8401142    }
    8411143
     
    9251227     * @dataProvider data_html_with_unbalanced_tags
    9261228     *
    927      * @expectedIncorrectUsage WP_Interactivity_API::_process_directives
    928      *
    9291229     * @param string $html HTML containing unbalanced tags and also a directive.
    9301230     */
     
    10881388     * Invokes the private `evaluate` method of WP_Interactivity_API class.
    10891389     *
    1090      * @param string $directive_value   The directive attribute value to evaluate.
     1390     * @param string $entry The entry array containing namespace, value, suffix, and unique ID.
    10911391     * @return mixed The result of the evaluate method.
    10921392     */
    1093     private function evaluate( $directive_value ) {
     1393    private function evaluate( $entry ) {
    10941394        /*
    10951395         * The global WP_Interactivity_API instance is momentarily replaced to
     
    11061406        }
    11071407
    1108         $result = $evaluate->invokeArgs( $this->interactivity, array( $directive_value ) );
     1408        $result = $evaluate->invokeArgs( $this->interactivity, array( $entry ) );
    11091409
    11101410        // Restore the original WP_Interactivity_API instance.
     
    11521452            )
    11531453        );
    1154         $this->set_internal_namespace_stack( 'myPlugin' );
    1155 
    1156         $result = $this->evaluate( 'state.key' );
     1454        $default_ns = 'myPlugin';
     1455        $this->set_internal_namespace_stack( $default_ns );
     1456
     1457        $result = $this->evaluate(
     1458            array(
     1459                'namespace' => $default_ns,
     1460                'value'     => 'state.key',
     1461            )
     1462        );
    11571463        $this->assertSame( 'myPlugin-state', $result );
    11581464
    1159         $result = $this->evaluate( 'context.key' );
     1465        $result = $this->evaluate(
     1466            array(
     1467                'namespace' => $default_ns,
     1468                'value'     => 'context.key',
     1469            )
     1470        );
    11601471        $this->assertSame( 'myPlugin-context', $result );
    11611472
    1162         $result = $this->evaluate( 'otherPlugin::state.key' );
     1473        $result = $this->evaluate(
     1474            array(
     1475                'namespace' => 'otherPlugin',
     1476                'value'     => 'state.key',
     1477            )
     1478        );
    11631479        $this->assertSame( 'otherPlugin-state', $result );
    11641480
    1165         $result = $this->evaluate( 'otherPlugin::context.key' );
     1481        $result = $this->evaluate(
     1482            array(
     1483                'namespace' => 'otherPlugin',
     1484                'value'     => 'context.key',
     1485            )
     1486        );
    11661487        $this->assertSame( 'otherPlugin-context', $result );
    11671488
    1168         $result = $this->evaluate( 'state.obj.prop' );
     1489        $result = $this->evaluate(
     1490            array(
     1491                'namespace' => $default_ns,
     1492                'value'     => 'state.obj.prop',
     1493            )
     1494        );
    11691495        $this->assertSame( 'object property', $result );
    11701496
    1171         $result = $this->evaluate( 'state.arrAccess.1' );
     1497        $result = $this->evaluate(
     1498            array(
     1499                'namespace' => $default_ns,
     1500                'value'     => 'state.arrAccess.1',
     1501            )
     1502        );
    11721503        $this->assertSame( '1', $result );
    11731504    }
     
    11901521            )
    11911522        );
    1192         $this->set_internal_namespace_stack( 'myPlugin' );
    1193 
    1194         $result = $this->evaluate( '!state.key' );
     1523        $default_ns = 'myPlugin';
     1524        $this->set_internal_namespace_stack( $default_ns );
     1525
     1526        $result = $this->evaluate(
     1527            array(
     1528                'namespace' => $default_ns,
     1529                'value'     => '!state.key',
     1530            )
     1531        );
    11951532        $this->assertFalse( $result );
    11961533
    1197         $result = $this->evaluate( '!context.key' );
     1534        $result = $this->evaluate(
     1535            array(
     1536                'namespace' => $default_ns,
     1537                'value'     => '!context.key',
     1538            )
     1539        );
    11981540        $this->assertFalse( $result );
    11991541
    1200         $result = $this->evaluate( 'otherPlugin::!state.key' );
     1542        $result = $this->evaluate(
     1543            array(
     1544                'namespace' => 'otherPlugin',
     1545                'value'     => '!state.key',
     1546            )
     1547        );
    12011548        $this->assertFalse( $result );
    12021549
    1203         $result = $this->evaluate( 'otherPlugin::!context.key' );
     1550        $result = $this->evaluate(
     1551            array(
     1552                'namespace' => 'otherPlugin',
     1553                'value'     => '!context.key',
     1554            )
     1555        );
    12041556        $this->assertFalse( $result );
    12051557    }
     
    12221574            )
    12231575        );
    1224         $this->set_internal_namespace_stack( 'myPlugin' );
    1225 
    1226         $result = $this->evaluate( '!state.missing' );
     1576        $default_ns = 'myPlugin';
     1577        $this->set_internal_namespace_stack( $default_ns );
     1578
     1579        $result = $this->evaluate(
     1580            array(
     1581                'namespace' => $default_ns,
     1582                'value'     => '!state.missing',
     1583            )
     1584        );
    12271585        $this->assertTrue( $result );
    12281586
    1229         $result = $this->evaluate( '!context.missing' );
     1587        $result = $this->evaluate(
     1588            array(
     1589                'namespace' => $default_ns,
     1590                'value'     => '!context.missing',
     1591            )
     1592        );
    12301593        $this->assertTrue( $result );
    12311594
    1232         $result = $this->evaluate( 'otherPlugin::!state.deeply.nested.missing' );
     1595        $result = $this->evaluate(
     1596            array(
     1597                'namespace' => 'otherPlugin',
     1598                'value'     => '!state.deeply.nested.missing',
     1599            )
     1600        );
    12331601        $this->assertTrue( $result );
    12341602
    1235         $result = $this->evaluate( 'otherPlugin::!context.deeply.nested.missing' );
     1603        $result = $this->evaluate(
     1604            array(
     1605                'namespace' => 'otherPlugin',
     1606                'value'     => '!context.deeply.nested.missing',
     1607            )
     1608        );
    12361609        $this->assertTrue( $result );
    12371610    }
     
    12531626            )
    12541627        );
    1255         $this->set_internal_namespace_stack( 'myPlugin' );
    1256 
    1257         $result = $this->evaluate( 'state.nonExistentKey' );
     1628        $default_ns = 'myPlugin';
     1629        $this->set_internal_namespace_stack( $default_ns );
     1630
     1631        $result = $this->evaluate(
     1632            array(
     1633                'namespace' => $default_ns,
     1634                'value'     => 'state.nonExistentKey',
     1635            )
     1636        );
    12581637        $this->assertNull( $result );
    12591638
    1260         $result = $this->evaluate( 'context.nonExistentKey' );
     1639        $result = $this->evaluate(
     1640            array(
     1641                'namespace' => $default_ns,
     1642                'value'     => 'context.nonExistentKey',
     1643            )
     1644        );
    12611645        $this->assertNull( $result );
    12621646
    1263         $result = $this->evaluate( 'otherPlugin::state.nonExistentKey' );
     1647        $result = $this->evaluate(
     1648            array(
     1649                'namespace' => 'otherPlugin',
     1650                'value'     => 'state.nonExistentKey',
     1651            )
     1652        );
    12641653        $this->assertNull( $result );
    12651654
    1266         $result = $this->evaluate( 'otherPlugin::context.nonExistentKey' );
     1655        $result = $this->evaluate(
     1656            array(
     1657                'namespace' => 'otherPlugin',
     1658                'value'     => 'context.nonExistentKey',
     1659            )
     1660        );
    12671661        $this->assertNull( $result );
    12681662
    1269         $result = $this->evaluate( ' state.key' ); // Extra space.
     1663        $result = $this->evaluate(
     1664            array(
     1665                'namespace' => $default_ns,
     1666                'value'     => ' state.key',  // Extra space.
     1667            )
     1668        );
    12701669        $this->assertNull( $result );
    12711670
    1272         $result = $this->evaluate( 'otherPlugin:: state.key' ); // Extra space.
     1671        $result = $this->evaluate(
     1672            array(
     1673                'namespace' => 'otherPlugin',
     1674                'value'     => ' state.key',  // Extra space.
     1675            )
     1676        );
    12731677        $this->assertNull( $result );
    12741678    }
     
    13041708            )
    13051709        );
    1306         $this->set_internal_namespace_stack( 'myPlugin' );
    1307 
    1308         $result = $this->evaluate( 'state.nested.key' );
     1710        $default_ns = 'myPlugin';
     1711        $this->set_internal_namespace_stack( $default_ns );
     1712
     1713        $result = $this->evaluate(
     1714            array(
     1715                'namespace' => $default_ns,
     1716                'value'     => 'state.nested.key',
     1717            )
     1718        );
    13091719        $this->assertSame( 'myPlugin-state-nested', $result );
    13101720
    1311         $result = $this->evaluate( 'context.nested.key' );
     1721        $result = $this->evaluate(
     1722            array(
     1723                'namespace' => $default_ns,
     1724                'value'     => 'context.nested.key',
     1725            )
     1726        );
    13121727        $this->assertSame( 'myPlugin-context-nested', $result );
    13131728
    1314         $result = $this->evaluate( 'otherPlugin::state.nested.key' );
     1729        $result = $this->evaluate(
     1730            array(
     1731                'namespace' => 'otherPlugin',
     1732                'value'     => 'state.nested.key',
     1733            )
     1734        );
    13151735        $this->assertSame( 'otherPlugin-state-nested', $result );
    13161736
    1317         $result = $this->evaluate( 'otherPlugin::context.nested.key' );
     1737        $result = $this->evaluate(
     1738            array(
     1739                'namespace' => 'otherPlugin',
     1740                'value'     => 'context.nested.key',
     1741            )
     1742        );
    13181743        $this->assertSame( 'otherPlugin-context-nested', $result );
    13191744    }
     
    13311756        $this->set_internal_namespace_stack();
    13321757
    1333         $result = $this->evaluate( 'path', 'null' );
     1758        $result = $this->evaluate(
     1759            array(
     1760                'namespace' => 'null',
     1761                'value'     => 'path',
     1762            )
     1763        );
    13341764        $this->assertNull( $result );
    13351765
    1336         $result = $this->evaluate( 'path', '' );
     1766        $result = $this->evaluate(
     1767            array(
     1768                'namespace' => '',
     1769                'value'     => 'path',
     1770            )
     1771        );
    13371772        $this->assertNull( $result );
    13381773
    1339         $result = $this->evaluate( 'path', '{}' );
     1774        $result = $this->evaluate(
     1775            array(
     1776                'namespace' => '{}',
     1777                'value'     => 'path',
     1778            )
     1779        );
    13401780        $this->assertNull( $result );
    13411781    }
     
    13751815        $this->set_internal_namespace_stack( 'myPlugin' );
    13761816
    1377         $result = $this->evaluate( 'state.derived' );
     1817        $result = $this->evaluate(
     1818            array(
     1819                'namespace' => 'myPlugin',
     1820                'value'     => 'state.derived',
     1821            )
     1822        );
    13781823        $this->assertSame( "Derived state: myPlugin-state\nDerived context: myPlugin-context", $result );
    13791824    }
     
    14181863        $this->set_internal_namespace_stack( 'myPlugin' );
    14191864
    1420         $result = $this->evaluate( 'state.derived' );
     1865        $result = $this->evaluate(
     1866            array(
     1867                'namespace' => 'myPlugin',
     1868                'value'     => 'state.derived',
     1869            )
     1870        );
    14211871        $this->assertSame( "Derived state: otherPlugin-state\nDerived context: otherPlugin-context", $result );
    14221872    }
     
    14611911        $this->set_internal_namespace_stack( 'myPlugin' );
    14621912
    1463         $result = $this->evaluate( 'otherPlugin::state.derived' );
     1913        $result = $this->evaluate(
     1914            array(
     1915                'namespace' => 'otherPlugin',
     1916                'value'     => 'state.derived',
     1917            )
     1918        );
    14641919        $this->assertSame( "Derived state: otherPlugin-state\nDerived context: otherPlugin-context", $result );
    14651920    }
     
    14851940        $this->set_internal_namespace_stack( 'myPlugin' );
    14861941
    1487         $result = $this->evaluate( 'state.derivedThatThrows' );
     1942        $result = $this->evaluate(
     1943            array(
     1944                'namespace' => 'myPlugin',
     1945                'value'     => 'state.derivedThatThrows',
     1946            )
     1947        );
    14881948        $this->assertNull( $result );
    14891949    }
     
    15081968        $this->set_internal_namespace_stack( 'myPlugin' );
    15091969
    1510         $result = $this->evaluate( 'state.derivedState.property' );
     1970        $result = $this->evaluate(
     1971            array(
     1972                'namespace' => 'myPlugin',
     1973                'value'     => 'state.derivedState.property',
     1974            )
     1975        );
    15111976        $this->assertSame( 'value', $result );
    15121977    }
Note: See TracChangeset for help on using the changeset viewer.