compiler = new FunctionDefinitionCompiler(); } public function test_function_is_compiled_correctly(): void { $function = new FunctionDefinition( 'foo', 'foo:42-1337', 'foo/bar', stdClass::class, new Parameters( new ParameterDefinition( 'bar', 'foo::bar', NativeStringType::get(), false, false, 'foo', EmptyAttributes::get() ) ), NativeStringType::get() ); $code = $this->compiler->compile($function); $compiledFunction = $this->eval($code); self::assertInstanceOf(FunctionDefinition::class, $compiledFunction); self::assertSame('foo', $compiledFunction->name()); self::assertSame('foo:42-1337', $compiledFunction->signature()); self::assertSame('foo/bar', $compiledFunction->fileName()); self::assertSame(stdClass::class, $compiledFunction->class()); self::assertTrue($compiledFunction->parameters()->has('bar')); self::assertInstanceOf(NativeStringType::class, $compiledFunction->returnType()); } public function test_modifying_function_definition_file_invalids_compiled_function_definition(): void { $fileName = sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid() . ".php"; file_put_contents($fileName, "compiler->compileValidation($class); $firstValidation = $this->eval($validationCode); unlink($fileName); touch($fileName, (new DateTime('+5 seconds'))->getTimestamp()); $secondValidation = $this->eval($validationCode); unlink($fileName); self::assertTrue($firstValidation); self::assertFalse($secondValidation); } /** * @return FunctionDefinition|bool */ private function eval(string $code) { try { return eval("return $code;"); } catch (Error $exception) { self::fail($exception->getMessage()); } } }