ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
FlavourMachineTest.php
Go to the documentation of this file.
1<?php
2
20
21use PHPUnit\Framework\Attributes\DataProvider;
42use PHPUnit\Framework\MockObject\MockObject;
44
49require_once __DIR__ . '/../AbstractTestBase.php';
50require_once __DIR__ . '/DummyDefinition.php';
51require_once __DIR__ . '/DummyMachine.php';
52require_once __DIR__ . '/BrokenDummyMachine.php';
53require_once __DIR__ . '/SVGDummyMachine.php';
54
56{
60 private MockObject $engine_factory_mock;
61
62 #[\Override]
63 protected function setUp(): void
64 {
65 $this->engine_factory_mock = $this->createMock(\ILIAS\ResourceStorage\Flavour\Engine\Factory::class);
66 }
67
68 public function testFactory(): void
69 {
70 $factory = new Factory($this->engine_factory_mock, [
71 \stdClass::class => \stdClass::class,
72 BrokenDummyMachine::class => BrokenDummyMachine::class
73 ]);
74
75 // Not a machine
76 $definition = $this->createMock(FlavourDefinition::class);
77 $definition->expects($this->once())->method('getFlavourMachineId')->willReturn(\stdClass::class);
78
79 $null_machine = $factory->get($definition);
80 $this->assertInstanceOf(NullMachine::class, $null_machine);
81 $this->assertSame('Machine stdClass does not implement FlavourMachine', $null_machine->getReason());
82 $this->assertSame('null_machine', $null_machine->getId());
83 $this->assertSame(NoEngine::class, $null_machine->dependsOnEngine());
84
85 // Broken machine
86 $definition = $this->createMock(FlavourDefinition::class);
87 $definition->expects($this->once())->method('getFlavourMachineId')->willReturn(BrokenDummyMachine::class);
88 $null_machine = $factory->get($definition);
89 $this->assertInstanceOf(NullMachine::class, $null_machine);
90 $this->assertSame(
91 'Could not instantiate machine ILIAS\ResourceStorage\Flavours\BrokenDummyMachine',
92 $null_machine->getReason()
93 );
94 $this->assertSame('null_machine', $null_machine->getId());
95 $this->assertSame(NoEngine::class, $null_machine->dependsOnEngine());
96 }
97
98 public static function definitionsToMachines(): \Iterator
99 {
100 yield [new PagesToExtract(true), ExtractPages::class, ImagickEngineWithOptionalFFMpeg::class];
101 yield [new CropToSquare(), CropSquare::class, GDEngine::class];
102 yield [new FitToSquare(), FitSquare::class, GDEngine::class];
103 yield [new ToGreyScale(), MakeGreyScale::class, GDEngine::class];
104 }
105
106
107 #[DataProvider('definitionsToMachines')]
108 public function testDefaultMachines(FlavourDefinition $d, string $machine): void
109 {
110 $factory = new Factory($this->engine_factory_mock);
111 $this->engine_factory_mock->expects($this->once())
112 ->method('get')
113 ->willReturn(new NoEngine());
114
115 $machine_instance = $factory->get($d);
116 $this->assertInstanceOf($machine, $machine_instance);
117 $machine_instance_second_get = $factory->get($d);
118 $this->assertSame($machine_instance, $machine_instance_second_get);
119 }
120
121 public static function machinesToEngines(): \Iterator
122 {
123 yield [ExtractPages::class, ImagickEngine::class];
124 yield [CropSquare::class, GDEngine::class];
125 yield [FitSquare::class, GDEngine::class];
126 yield [MakeGreyScale::class, GDEngine::class];
127 }
128
129 #[DataProvider('machinesToEngines')]
130 public function testDefaultMachineEngines(string $machine, string $engine): void
131 {
132 $factory = new \ILIAS\ResourceStorage\Flavour\Engine\Factory();
133 $engine_instance = $factory->get(new $machine());
134 $this->assertInstanceOf($engine, $engine_instance);
135 }
136
137 #[DataProvider('definitionsToMachines')]
138 public function testNullMachineFallback(FlavourDefinition $d, string $machine, string $engine): void
139 {
140 $factory = new Factory($this->engine_factory_mock);
141
142 $engine_mock = $this->createMock(Engine::class);
143
144 $this->engine_factory_mock->expects($this->once())
145 ->method('get')
146 ->willReturn($engine_mock);
147
148 $engine_mock->expects($this->once())
149 ->method('isRunning')
150 ->willReturn(false);
151
152 $machine_instance = $factory->get($d);
153 $this->assertInstanceOf(NullMachine::class, $machine_instance);
154 $this->assertSame(
155 "Machine $machine depends on engine $engine which is not running or available.",
156 $machine_instance->getReason()
157 );
158 }
159
160
161 public function testMachineResult(): void
162 {
163 $svg_stream = Streams::ofString(
164 '<?xml version="1.0" encoding="UTF-8"?>
165<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 155 155"><defs><style>.cls-1{fill:red;}</style></defs><g><g><rect class="cls-1" x="3" y="3" width="150" height="150"/><path d="M151.14,6V151.14H6V6H151.14m6-6H0V157.14H157.14V0h0Z"/></g></g></svg>'
166 );
167 $machine = new SVGDummyMachine();
168 ;
169 $definition = $this->createSVGColorChangeDefinition('red', 'blue');
170 $file_info = new FileInformation();
171
172 $result = iterator_to_array($machine->processStream($file_info, $svg_stream, $definition));
173 $this->assertCount(1, $result);
174 $result_one = $result[0];
175 $this->assertInstanceOf(Result::class, $result_one);
176 $this->assertEquals($definition, $result_one->getDefinition());
177 $this->assertInstanceOf(FileStream::class, $result_one->getStream());
178 $this->assertSame(
179 '<?xml version="1.0" encoding="UTF-8"?>
180<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 155 155"><defs><style>.cls-1{fill:blue;}</style></defs><g><g><rect class="cls-1" x="3" y="3" width="150" height="150"/><path d="M151.14,6V151.14H6V6H151.14m6-6H0V157.14H157.14V0h0Z"/></g></g></svg>',
181 (string) $result_one->getStream()
182 );
183 }
184
185 private function createSVGColorChangeDefinition(string $color, string $to_color): FlavourDefinition
186 {
187 return new class ($color, $to_color) extends DummyDefinition {
188 public function __construct(private string $color, private string $to_color)
189 {
191 'svg_color_changer',
192 'svg_color_changing_machine'
193 );
194 }
195
196 public function getColor(): string
197 {
198 return $this->color;
199 }
200
201 public function getToColor(): string
202 {
203 return $this->to_color;
204 }
205 };
206 }
207}
Stream factory which enables the user to create streams without the knowledge of the concrete class.
Definition: Streams.php:32
static ofString(string $string)
Creates a new stream with an initial value.
Definition: Streams.php:41
__construct(protected FlavourBuilder $flavour_builder, protected ResourceBuilder $resource_builder)
Definition: Flavours.php:32
testDefaultMachineEngines(string $machine, string $engine)
testDefaultMachines(FlavourDefinition $d, string $machine)
createSVGColorChangeDefinition(string $color, string $to_color)
testNullMachineFallback(FlavourDefinition $d, string $machine, string $engine)
The base interface for all filesystem streams.
Definition: FileStream.php:32
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.