10
10
use PHPUnit \Framework \TestCase ;
11
11
use Templado \Engine \Example \ViewModel ;
12
12
use Templado \Engine \PrefixModel \PrefixCallViewModel ;
13
+ use Templado \Engine \PrefixModel \PrefixPropertyGetViewModel ;
14
+ use Templado \Engine \PrefixModel \PrefixPropertyViewModel ;
13
15
use Templado \Engine \PrefixModel \PrefixViewModel ;
14
16
use Templado \Engine \ResourceModel \ResourceCallViewModel ;
17
+ use Templado \Engine \ResourceModel \ResourcePropertyGetViewModel ;
18
+ use Templado \Engine \ResourceModel \ResourcePropertyViewModel ;
15
19
use Templado \Engine \ResourceModel \ResourceViewModel ;
16
20
17
21
#[CoversClass(ViewModelRenderer::class)]
@@ -431,8 +435,8 @@ public function asString() {
431
435
);
432
436
}
433
437
434
- public function testResourceViewModelGetsAppliedAsExcepted (): void {
435
- $ viewModel = new ResourceViewModel ();
438
+ #[DataProvider( ' resourceViewModelProvider ' )]
439
+ public function testResourceViewModelGetsAppliedAsExcepted ( object $ viewModel): void {
436
440
$ dom = new DOMDocument ();
437
441
$ dom ->preserveWhiteSpace = false ;
438
442
$ dom ->load (__DIR__ . '/../_data/viewmodel/resource/source.html ' );
@@ -447,20 +451,13 @@ public function testResourceViewModelGetsAppliedAsExcepted(): void {
447
451
$ this ->assertResultMatches ($ expected ->documentElement , $ dom ->documentElement );
448
452
}
449
453
450
- public function testResourceViewModelWithMagicCallGetsAppliedAsExcepted (): void {
451
- $ viewModel = new ResourceCallViewModel ();
452
- $ dom = new DOMDocument ();
453
- $ dom ->preserveWhiteSpace = false ;
454
- $ dom ->load (__DIR__ . '/../_data/viewmodel/resource/source.html ' );
455
-
456
- $ renderer = new ViewModelRenderer ();
457
- $ renderer ->render ($ dom ->documentElement , $ viewModel );
458
-
459
- $ expected = new DOMDocument ();
460
- $ expected ->preserveWhiteSpace = false ;
461
- $ expected ->load (__DIR__ . '/../_data/viewmodel/resource/expected.html ' );
462
-
463
- $ this ->assertResultMatches ($ expected ->documentElement , $ dom ->documentElement );
454
+ public static function resourceViewModelProvider (): array {
455
+ return [
456
+ 'method ' => [new ResourceViewModel ()],
457
+ 'call ' => [new ResourceCallViewModel ()],
458
+ 'property ' => [new ResourcePropertyViewModel ()],
459
+ 'get ' => [new ResourcePropertyGetViewModel ()]
460
+ ];
464
461
}
465
462
466
463
public function testUsingAResourceWithNoMethodToRequestItThrowsException (): void {
@@ -483,8 +480,9 @@ public function testResolvingResourceToNonObjectThrowsException(): void {
483
480
$ renderer ->render ($ dom ->documentElement , new class { public function foo (): string { return 'crash ' ; }});
484
481
}
485
482
486
- public function testPrefixViewModelGetsAppliedAsExcepted (): void {
487
- $ viewModel = new PrefixViewModel ();
483
+
484
+ #[DataProvider('prefixViewModelProvider ' )]
485
+ public function testPrefixViewModelGetsAppliedAsExcepted (object $ viewModel ): void {
488
486
$ dom = new DOMDocument ();
489
487
$ dom ->preserveWhiteSpace = false ;
490
488
$ dom ->load (__DIR__ . '/../_data/viewmodel/prefix/source.html ' );
@@ -499,6 +497,15 @@ public function testPrefixViewModelGetsAppliedAsExcepted(): void {
499
497
$ this ->assertResultMatches ($ expected ->documentElement , $ dom ->documentElement );
500
498
}
501
499
500
+ public static function prefixViewModelProvider (): array {
501
+ return [
502
+ 'method ' => [new PrefixViewModel ()],
503
+ 'call ' => [new PrefixCallViewModel ()],
504
+ 'property ' => [new PrefixPropertyViewModel ()],
505
+ 'get ' => [new PrefixPropertyGetViewModel ()]
506
+ ];
507
+ }
508
+
502
509
public function testPrefixWithDoubleColonViewModelGetsAppliedAsExcepted (): void {
503
510
$ viewModel = new PrefixViewModel ();
504
511
$ dom = new DOMDocument ();
@@ -515,22 +522,6 @@ public function testPrefixWithDoubleColonViewModelGetsAppliedAsExcepted(): void
515
522
$ this ->assertResultMatches ($ expected ->documentElement , $ dom ->documentElement );
516
523
}
517
524
518
- public function testPrefixViewModelWithMagicCallGetsAppliedAsExcepted (): void {
519
- $ viewModel = new PrefixCallViewModel ();
520
- $ dom = new DOMDocument ();
521
- $ dom ->preserveWhiteSpace = false ;
522
- $ dom ->load (__DIR__ . '/../_data/viewmodel/prefix/source.html ' );
523
-
524
- $ renderer = new ViewModelRenderer ();
525
- $ renderer ->render ($ dom ->documentElement , $ viewModel );
526
-
527
- $ expected = new DOMDocument ();
528
- $ expected ->preserveWhiteSpace = false ;
529
- $ expected ->load (__DIR__ . '/../_data/viewmodel/prefix/expected.html ' );
530
-
531
- $ this ->assertResultMatches ($ expected ->documentElement , $ dom ->documentElement );
532
- }
533
-
534
525
public function testUsingAPrefixWithNoMethodToRequestItThrowsException (): void {
535
526
$ dom = new DOMDocument ();
536
527
$ dom ->loadXML ('<?xml version="1.0"?><root prefix="p: foo" /> ' );
@@ -1049,4 +1040,57 @@ public function document(): Document {
1049
1040
1050
1041
$ this ->assertResultMatches ($ expected ->documentElement , $ dom ->documentElement );
1051
1042
}
1043
+
1044
+ #[DataProvider('attributeViewModelProvider ' )]
1045
+ public function testAttributesGetAppliedFromViewModelProperties (object $ model , string $ value ): void {
1046
+ $ dom = new DOMDocument ();
1047
+ $ dom ->loadXML ('<root property="document" attr="default" /> ' );
1048
+
1049
+ $ renderer = new ViewModelRenderer ();
1050
+ $ renderer ->render (
1051
+ $ dom ->documentElement ,
1052
+ $ model
1053
+ );
1054
+
1055
+ $ expected = new DOMDocument ();
1056
+ $ expected ->loadXML ('<root property="document" attr=" ' .$ value .'" /> ' );
1057
+
1058
+ $ this ->assertResultMatches ($ expected ->documentElement , $ dom ->documentElement );
1059
+ }
1060
+
1061
+ public static function attributeViewModelProvider (): array {
1062
+ return [
1063
+ 'property ' => [
1064
+ new class {
1065
+ public function document (): object {
1066
+ return new class {
1067
+ public string $ attr ='changed ' ;
1068
+ };
1069
+ }
1070
+ },
1071
+ 'changed '
1072
+ ],
1073
+ 'get ' => [
1074
+ new class {
1075
+ public function document (): object {
1076
+ return new class {
1077
+ public function __get (string $ key ): string |true {
1078
+ return $ key === 'attr ' ? 'changed ' : true ;
1079
+ }
1080
+ };
1081
+ }
1082
+ },
1083
+ 'changed '
1084
+ ],
1085
+ 'none ' => [
1086
+ new class {
1087
+ public function document (): object {
1088
+ return new class {
1089
+ };
1090
+ }
1091
+ },
1092
+ 'default '
1093
+ ]
1094
+ ];
1095
+ }
1052
1096
}
0 commit comments