public function testVerifyReturnsFailureIfSolutionOutputDoesNotMatchUserOutput()
 {
     $solution = SingleFileSolution::fromFile(realpath(__DIR__ . '/../res/cli/solution.php'));
     $this->exercise->expects($this->once())->method('getSolution')->will($this->returnValue($solution));
     $this->exercise->expects($this->once())->method('getArgs')->will($this->returnValue([1, 2, 3]));
     $failure = $this->runner->verify(__DIR__ . '/../res/cli/user-wrong.php');
     $this->assertInstanceOf(StdOutFailure::class, $failure);
     $this->assertEquals('6', $failure->getExpectedOutput());
     $this->assertEquals('10', $failure->getActualOutput());
 }
 public function testGetters()
 {
     $tempPath = sprintf('%s/%s', realpath(sys_get_temp_dir()), $this->getName());
     $filePath = sprintf('%s/test.file', $tempPath);
     @mkdir($tempPath, 0775, true);
     touch($filePath);
     $solution = SingleFileSolution::fromFile($filePath);
     $this->assertSame($filePath, $solution->getEntryPoint());
     $this->assertSame($tempPath, $solution->getBaseDirectory());
     $this->assertFalse($solution->hasComposerFile());
     $this->assertInternalType('array', $solution->getFiles());
     $this->assertCount(1, $solution->getFiles());
     $this->assertSame($filePath, $solution->getFiles()[0]->__toString());
     unlink($filePath);
     rmdir($tempPath);
 }
 public function testAlteringDatabaseInSolutionDoesNotEffectDatabaseInUserSolution()
 {
     $solution = SingleFileSolution::fromFile(realpath(__DIR__ . '/../res/database/solution-alter-db.php'));
     $this->exercise->expects($this->once())->method('getSolution')->will($this->returnValue($solution));
     $this->exercise->expects($this->any())->method('getArgs')->will($this->returnValue([]));
     $this->exercise->expects($this->atLeastOnce())->method('getType')->will($this->returnValue(ExerciseType::CLI()));
     $this->exercise->expects($this->once())->method('configure')->will($this->returnCallback(function (ExerciseDispatcher $dispatcher) {
         $dispatcher->requireCheck(DatabaseCheck::class);
     }));
     $this->exercise->expects($this->once())->method('seed')->with($this->isInstanceOf(PDO::class))->will($this->returnCallback(function (PDO $db) {
         $db->exec('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, gender TEXT)');
         $stmt = $db->prepare('INSERT into users (name, age, gender) VALUES (:name, :age, :gender)');
         $stmt->execute([':name' => 'Jimi Hendrix', ':age' => 27, ':gender' => 'Male']);
     }));
     $this->exercise->expects($this->once())->method('verify')->with($this->isInstanceOf(PDO::class))->will($this->returnCallback(function (PDO $db) {
         $users = $db->query('SELECT * FROM users');
         $users = $users->fetchAll(PDO::FETCH_ASSOC);
         $this->assertEquals([['id' => 1, 'name' => 'Jimi Hendrix', 'age' => '27', 'gender' => 'Male'], ['id' => 2, 'name' => 'Kurt Cobain', 'age' => '27', 'gender' => 'Male']], $users);
     }));
     $results = new ResultAggregator();
     $eventDispatcher = new EventDispatcher($results);
     $checkRepository = new CheckRepository([$this->check]);
     $dispatcher = new ExerciseDispatcher(new RunnerFactory(), $results, $eventDispatcher, $checkRepository);
     $dispatcher->verify($this->exercise, __DIR__ . '/../res/database/user-solution-alter-db.php');
 }
 public function testVerifyReturnsFailureIfSolutionOutputHeadersDoesNotMatchUserOutputHeaders()
 {
     $solution = SingleFileSolution::fromFile(__DIR__ . '/../res/cgi/get-solution-header.php');
     $this->exercise->expects($this->once())->method('getSolution')->will($this->returnValue($solution));
     $request = (new Request())->withMethod('GET')->withUri(new Uri('http://some.site?number=5'));
     $this->exercise->expects($this->once())->method('getRequests')->will($this->returnValue([$request]));
     $failure = $this->runner->verify(realpath(__DIR__ . '/../res/cgi/get-user-header-wrong.php'));
     $this->assertInstanceOf(CgiOutResult::class, $failure);
     $this->assertCount(1, $failure);
     $result = iterator_to_array($failure)[0];
     $this->assertInstanceOf(CgiOutRequestFailure::class, $result);
     $this->assertSame($result->getExpectedOutput(), $result->getActualOutput());
     $this->assertEquals(['Pragma' => 'cache', 'Content-type' => 'text/html; charset=UTF-8'], $result->getExpectedHeaders());
     $this->assertEquals(['Pragma' => 'no-cache', 'Content-type' => 'text/html; charset=UTF-8'], $result->getActualHeaders());
 }
 public function testVerifyReturnsFailureIfSolutionOutputDoesNotMatchUserOutput()
 {
     $solution = SingleFileSolution::fromFile(realpath(__DIR__ . '/../res/cli/solution.php'));
     $this->exercise->expects($this->once())->method('getSolution')->will($this->returnValue($solution));
     $this->exercise->expects($this->once())->method('getArgs')->will($this->returnValue([[1, 2, 3]]));
     $failure = $this->runner->verify(new Input('app', ['program' => __DIR__ . '/../res/cli/user-wrong.php']));
     $this->assertInstanceOf(CLiResult::class, $failure);
     $this->assertCount(1, $failure);
     $result = iterator_to_array($failure)[0];
     $this->assertInstanceOf(RequestFailure::class, $result);
     $this->assertEquals('6', $result->getExpectedOutput());
     $this->assertEquals('10', $result->getActualOutput());
 }
 /**
  * @return SolutionInterface
  */
 public function getSolution()
 {
     return SingleFileSolution::fromFile(realpath(sprintf('%s/../../exercises/%s/solution/solution.php', dirname((new ReflectionClass(static::class))->getFileName()), $this->normaliseName($this->getName()))));
 }