Chris@0: getMockBuilder('Drupal\simpletest\TestBase') Chris@0: ->setConstructorArgs([$test_id]) Chris@0: ->setMethods(['storeAssertion']) Chris@0: ->getMockForAbstractClass(); Chris@0: // Override storeAssertion() so we don't need a database. Chris@0: $mock_test_base->expects($this->any()) Chris@0: ->method('storeAssertion') Chris@0: ->will($this->returnValue(NULL)); Chris@0: return $mock_test_base; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Invoke methods that are protected or private. Chris@0: * Chris@0: * @param object $object Chris@0: * Object on which to invoke the method. Chris@0: * @param string $method_name Chris@0: * Name of the method to invoke. Chris@0: * @param array $arguments Chris@0: * Array of arguments to be passed to the method. Chris@0: * Chris@0: * @return mixed Chris@0: * Value returned by the invoked method. Chris@0: */ Chris@0: public function invokeProtectedMethod($object, $method_name, array $arguments) { Chris@0: $ref_method = new \ReflectionMethod($object, $method_name); Chris@0: $ref_method->setAccessible(TRUE); Chris@0: return $ref_method->invokeArgs($object, $arguments); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Provides data for the random string validation test. Chris@0: * Chris@0: * @return array Chris@0: * - The expected result of the validation. Chris@0: * - The string to validate. Chris@0: */ Chris@0: public function providerRandomStringValidate() { Chris@0: return [ Chris@0: [FALSE, ' curry paste'], Chris@0: [FALSE, 'curry paste '], Chris@0: [FALSE, 'curry paste'], Chris@0: [FALSE, 'curry paste'], Chris@0: [TRUE, 'curry paste'], Chris@0: [TRUE, 'thai green curry paste'], Chris@0: [TRUE, '@startswithat'], Chris@0: [TRUE, 'contains@at'], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::randomStringValidate Chris@0: * @dataProvider providerRandomStringValidate Chris@0: */ Chris@0: public function testRandomStringValidate($expected, $string) { Chris@0: $mock_test_base = $this->getMockForAbstractClass('Drupal\simpletest\TestBase'); Chris@0: $actual = $mock_test_base->randomStringValidate($string); Chris@0: $this->assertEquals($expected, $actual); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Provides data for testRandomString() and others. Chris@0: * Chris@0: * @return array Chris@0: * - The number of items (characters, object properties) we expect any of Chris@0: * the random functions to give us. Chris@0: */ Chris@0: public function providerRandomItems() { Chris@0: return [ Chris@0: [NULL], Chris@0: [0], Chris@0: [1], Chris@0: [2], Chris@0: [3], Chris@0: [4], Chris@0: [7], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::randomString Chris@0: * @dataProvider providerRandomItems Chris@0: */ Chris@0: public function testRandomString($length) { Chris@0: $mock_test_base = $this->getMockForAbstractClass('Drupal\simpletest\TestBase'); Chris@0: $string = $mock_test_base->randomString($length); Chris@0: $this->assertEquals($length, strlen($string)); Chris@0: // randomString() should always include an ampersand ('&') and a Chris@0: // greater than ('>') if $length is greater than 3. Chris@0: if ($length > 4) { Chris@0: $this->assertContains('&', $string); Chris@0: $this->assertContains('>', $string); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::randomObject Chris@0: * @dataProvider providerRandomItems Chris@0: */ Chris@0: public function testRandomObject($size) { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: // Note: count((array)object) works for now, maybe not later. Chris@0: $this->assertEquals($size, count((array) $test_base->randomObject($size))); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::checkRequirements Chris@0: */ Chris@0: public function testCheckRequirements() { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertInternalType( Chris@0: 'array', Chris@0: $this->invokeProtectedMethod($test_base, 'checkRequirements', []) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Data provider for testAssert(). Chris@0: * Chris@0: * @return array Chris@0: * Standard dataProvider array of arrays: Chris@0: * - Expected result from assert(). Chris@0: * - Expected status stored in TestBase->assertions. Chris@0: * - Status, passed to assert(). Chris@0: * - Message, passed to assert(). Chris@0: * - Group, passed to assert(). Chris@0: * - Caller, passed to assert(). Chris@0: */ Chris@0: public function providerAssert() { Chris@0: return [ Chris@0: [TRUE, 'pass', TRUE, 'Yay pass', 'test', []], Chris@0: [FALSE, 'fail', FALSE, 'Boo fail', 'test', []], Chris@0: [TRUE, 'pass', 'pass', 'Yay pass', 'test', []], Chris@0: [FALSE, 'fail', 'fail', 'Boo fail', 'test', []], Chris@0: [FALSE, 'exception', 'exception', 'Boo fail', 'test', []], Chris@0: [FALSE, 'debug', 'debug', 'Boo fail', 'test', []], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::assert Chris@0: * @dataProvider providerAssert Chris@0: */ Chris@0: public function testAssert($expected, $assertion_status, $status, $message, $group, $caller) { Chris@0: $test_id = 'luke_i_am_your_' . $assertion_status; Chris@0: $test_base = $this->getTestBaseForAssertionTests($test_id); Chris@0: Chris@0: // Verify some startup values. Chris@0: $this->assertAttributeEmpty('assertions', $test_base); Chris@0: if (is_string($status)) { Chris@0: $this->assertEquals(0, $test_base->results['#' . $status]); Chris@0: } Chris@0: Chris@0: // assert() is protected so we have to make it accessible. Chris@0: $ref_assert = new \ReflectionMethod($test_base, 'assert'); Chris@0: $ref_assert->setAccessible(TRUE); Chris@0: Chris@0: // Call assert() from within our hall of mirrors. Chris@0: $this->assertEquals( Chris@0: $expected, Chris@0: $ref_assert->invokeArgs($test_base, Chris@0: [$status, $message, $group, $caller] Chris@0: ) Chris@0: ); Chris@0: Chris@0: // Check the side-effects of assert(). Chris@0: if (is_string($status)) { Chris@0: $this->assertEquals(1, $test_base->results['#' . $status]); Chris@0: } Chris@0: $this->assertAttributeNotEmpty('assertions', $test_base); Chris@0: // Make a ReflectionProperty for the assertions property, Chris@0: // since it's protected. Chris@0: $ref_assertions = new \ReflectionProperty($test_base, 'assertions'); Chris@0: $ref_assertions->setAccessible(TRUE); Chris@0: $assertions = $ref_assertions->getValue($test_base); Chris@0: $assertion = reset($assertions); Chris@0: $this->assertEquals($assertion_status, $assertion['status']); Chris@0: $this->assertEquals($test_id, $assertion['test_id']); Chris@0: $this->assertEquals(get_class($test_base), $assertion['test_class']); Chris@0: $this->assertEquals($message, $assertion['message']); Chris@0: $this->assertEquals($group, $assertion['message_group']); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Data provider for assertTrue(). Chris@0: */ Chris@0: public function providerAssertTrue() { Chris@0: return [ Chris@0: [TRUE, TRUE], Chris@0: [FALSE, FALSE], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::assertTrue Chris@0: * @dataProvider providerAssertTrue Chris@0: */ Chris@0: public function testAssertTrue($expected, $value) { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertEquals( Chris@0: $expected, Chris@0: $this->invokeProtectedMethod($test_base, 'assertTrue', [$value]) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::assertFalse Chris@0: * @dataProvider providerAssertTrue Chris@0: */ Chris@0: public function testAssertFalse($expected, $value) { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertEquals( Chris@0: (!$expected), Chris@0: $this->invokeProtectedMethod($test_base, 'assertFalse', [$value]) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Data provider for assertNull(). Chris@0: */ Chris@0: public function providerAssertNull() { Chris@0: return [ Chris@0: [TRUE, NULL], Chris@0: [FALSE, ''], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::assertNull Chris@0: * @dataProvider providerAssertNull Chris@0: */ Chris@0: public function testAssertNull($expected, $value) { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertEquals( Chris@0: $expected, Chris@0: $this->invokeProtectedMethod($test_base, 'assertNull', [$value]) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::assertNotNull Chris@0: * @dataProvider providerAssertNull Chris@0: */ Chris@0: public function testAssertNotNull($expected, $value) { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertEquals( Chris@0: (!$expected), Chris@0: $this->invokeProtectedMethod($test_base, 'assertNotNull', [$value]) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Data provider for tests of equality assertions. Chris@0: * Chris@0: * Used by testAssertIdentical(), testAssertEqual(), testAssertNotIdentical(), Chris@0: * and testAssertNotEqual(). Chris@0: * Chris@0: * @return Chris@0: * Array of test data. Chris@0: * - Expected assertion value for identical comparison. Chris@0: * - Expected assertion value for equal comparison. Chris@0: * - First value to compare. Chris@0: * - Second value to compare. Chris@0: */ Chris@0: public function providerEqualityAssertions() { Chris@0: return [ Chris@0: // Integers and floats. Chris@0: [TRUE, TRUE, 0, 0], Chris@0: [FALSE, TRUE, 0, 0.0], Chris@0: [FALSE, TRUE, '0', 0], Chris@0: [FALSE, TRUE, '0.0', 0.0], Chris@0: [FALSE, FALSE, 23, 77], Chris@0: [TRUE, TRUE, 23.0, 23.0], Chris@0: // Strings. Chris@0: [FALSE, FALSE, 'foof', 'yay'], Chris@0: [TRUE, TRUE, 'yay', 'yay'], Chris@0: // Bools with type conversion. Chris@0: [TRUE, TRUE, TRUE, TRUE], Chris@0: [TRUE, TRUE, FALSE, FALSE], Chris@0: [FALSE, TRUE, NULL, FALSE], Chris@0: [FALSE, TRUE, 'TRUE', TRUE], Chris@0: [FALSE, FALSE, 'FALSE', FALSE], Chris@0: [FALSE, TRUE, 0, FALSE], Chris@0: [FALSE, TRUE, 1, TRUE], Chris@0: [FALSE, TRUE, -1, TRUE], Chris@0: [FALSE, TRUE, '1', TRUE], Chris@0: [FALSE, TRUE, '1.3', TRUE], Chris@0: // Null. Chris@0: [FALSE, FALSE, 'NULL', NULL], Chris@0: [TRUE, TRUE, NULL, NULL], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::assertIdentical Chris@0: * @dataProvider providerEqualityAssertions Chris@0: */ Chris@0: public function testAssertIdentical($expected_identical, $expected_equal, $first, $second) { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertEquals( Chris@0: $expected_identical, Chris@0: $this->invokeProtectedMethod($test_base, 'assertIdentical', [$first, $second]) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::assertNotIdentical Chris@0: * @dataProvider providerEqualityAssertions Chris@0: */ Chris@0: public function testAssertNotIdentical($expected_identical, $expected_equal, $first, $second) { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertEquals( Chris@0: (!$expected_identical), Chris@0: $this->invokeProtectedMethod($test_base, 'assertNotIdentical', [$first, $second]) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::assertEqual Chris@0: * @dataProvider providerEqualityAssertions Chris@0: */ Chris@0: public function testAssertEqual($expected_identical, $expected_equal, $first, $second) { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertEquals( Chris@0: $expected_equal, Chris@0: $this->invokeProtectedMethod($test_base, 'assertEqual', [$first, $second]) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::assertNotEqual Chris@0: * @dataProvider providerEqualityAssertions Chris@0: */ Chris@0: public function testAssertNotEqual($expected_identical, $expected_equal, $first, $second) { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertEquals( Chris@0: (!$expected_equal), Chris@0: $this->invokeProtectedMethod($test_base, 'assertNotEqual', [$first, $second]) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Data provider for testAssertIdenticalObject(). Chris@0: */ Chris@0: public function providerAssertIdenticalObject() { Chris@0: $obj1 = new \stdClass(); Chris@0: $obj1->foof = 'yay'; Chris@0: $obj2 = $obj1; Chris@0: $obj3 = clone $obj1; Chris@0: $obj4 = new \stdClass(); Chris@0: return [ Chris@0: [TRUE, $obj1, $obj2], Chris@0: [TRUE, $obj1, $obj3], Chris@0: [FALSE, $obj1, $obj4], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::assertIdenticalObject Chris@0: * @dataProvider providerAssertIdenticalObject Chris@0: */ Chris@0: public function testAssertIdenticalObject($expected, $first, $second) { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertEquals( Chris@0: $expected, Chris@0: $this->invokeProtectedMethod($test_base, 'assertIdenticalObject', [$first, $second]) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::pass Chris@0: */ Chris@0: public function testPass() { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertEquals( Chris@0: TRUE, Chris@0: $this->invokeProtectedMethod($test_base, 'pass', []) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::fail Chris@0: */ Chris@0: public function testFail() { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertEquals( Chris@0: FALSE, Chris@0: $this->invokeProtectedMethod($test_base, 'fail', []) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Data provider for testError(). Chris@0: * Chris@0: * @return array Chris@0: * - Expected status for assertion. Chris@0: * - Group for use in assert(). Chris@0: */ Chris@0: public function providerError() { Chris@0: return [ Chris@0: ['debug', 'User notice'], Chris@0: ['exception', 'Not User notice'], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::error Chris@0: * @dataProvider providerError Chris@0: */ Chris@0: public function testError($status, $group) { Chris@0: // Mock up a TestBase object. Chris@0: $mock_test_base = $this->getMockBuilder('Drupal\simpletest\TestBase') Chris@0: ->setMethods(['assert']) Chris@0: ->getMockForAbstractClass(); Chris@0: Chris@0: // Set expectations for assert(). Chris@0: $mock_test_base->expects($this->once()) Chris@0: ->method('assert') Chris@0: // The first argument to assert() should be the expected $status. This is Chris@0: // the most important expectation of this test. Chris@0: ->with($status) Chris@0: // Arbitrary return value. Chris@0: ->willReturn("$status:$group"); Chris@0: Chris@0: // Invoke error(). Chris@0: $this->assertEquals( Chris@0: "$status:$group", Chris@0: $this->invokeProtectedMethod($mock_test_base, 'error', ['msg', $group]) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers ::getRandomGenerator Chris@0: */ Chris@0: public function testGetRandomGenerator() { Chris@0: $test_base = $this->getTestBaseForAssertionTests('test_id'); Chris@0: $this->assertInstanceOf( Chris@0: 'Drupal\Component\Utility\Random', Chris@0: $this->invokeProtectedMethod($test_base, 'getRandomGenerator', []) Chris@0: ); Chris@0: } Chris@0: Chris@0: }