<?php
namespace Magento\AcceptanceTest\_default\Backend;

use Magento\FunctionalTestingFramework\AcceptanceTester;
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore;
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler;
use \Codeception\Util\Locator;
use Yandex\Allure\Adapter\Annotation\Features;
use Yandex\Allure\Adapter\Annotation\Stories;
use Yandex\Allure\Adapter\Annotation\Title;
use Yandex\Allure\Adapter\Annotation\Description;
use Yandex\Allure\Adapter\Annotation\Parameter;
use Yandex\Allure\Adapter\Annotation\Severity;
use Yandex\Allure\Adapter\Model\SeverityLevel;
use Yandex\Allure\Adapter\Annotation\TestCaseId;

/**
 */
class AssertTestCest
{
	/**
	  * @param AcceptanceTester $I
	  * @throws \Exception
	  */
	public function _before(AcceptanceTester $I)
	{
		$I->amGoingTo("create entity that has the stepKey: createData1");
		PersistedObjectHandler::getInstance()->createEntity(
			"createData1",
			"hook",
			"ReplacementPerson",
			[],
			null
		);
	}

	/**
	 * @Features({"TestModule"})
	 * @Parameter(name = "AcceptanceTester", value="$I")
	 * @param AcceptanceTester $I
	 * @return void
	 * @throws \Exception
	 */
	public function AssertTest(AcceptanceTester $I)
	{
		$I->amGoingTo("create entity that has the stepKey: createData2");
		PersistedObjectHandler::getInstance()->createEntity(
			"createData2",
			"test",
			"UniquePerson",
			[],
			null
		);
		$grabTextFrom1 = $I->grabTextFrom(".copyright>span");
		$I->assertArrayIsSorted(["1", "2", "3", "4", "5"], "asc");
		$I->comment("asserts without variable replacement");
		$I->assertArrayHasKey("apple", ['orange' => 2, 'apple' => 1], "pass");
		$I->assertArrayNotHasKey("kiwi", ['orange' => 2, 'apple' => 1], "pass");
		$I->assertArraySubset([1, 2], [1, 2, 3, 5], "pass");
		$I->assertContains("ab", ['item1' => 'a', 'item2' => 'ab'], "pass");
		$I->assertCount(2, ['a', 'b'], "pass");
		$I->assertEmpty([], "pass");
		$I->assertEquals($text, "Copyright © 2013-2017 Magento, Inc. All rights reserved.", "pass");
		$I->assertEquals("Copyright © 2013-2017 Magento, Inc. All rights reserved.", $text, "pass");
		$I->assertFalse(false, "pass");
		$I->assertFileNotExists("/out.txt", "pass");
		$I->assertFileNotExists($text, "pass");
		$I->assertGreaterOrEquals(2, 5, "pass");
		$I->assertGreaterThan(2, 5, "pass");
		$I->assertGreaterThanOrEqual(2, 5, "pass");
		$I->assertInternalType("string", "xyz", "pass");
		$I->assertInternalType("int", 21, "pass");
		$I->assertInternalType("string", $text, "pass");
		$I->assertLessOrEquals(5, 2, "pass");
		$I->assertLessThan(5, 2, "pass");
		$I->assertLessThanOrEqual(5, 2, "pass");
		$I->assertNotContains("bc", ['item1' => 'a', 'item2' => 'ab'], "pass");
		$I->assertNotContains("bc", $text, "pass");
		$I->assertNotEmpty([1, 2], "pass");
		$I->assertNotEmpty($text, "pass");
		$I->assertNotEquals(2, 5, "pass", 0);
		$I->assertNotNull("abc", "pass");
		$I->assertNotNull($text, "pass");
		$I->assertNotRegExp("/foo/", "bar", "pass");
		$I->assertNotSame("log", "tag", "pass");
		$I->assertRegExp("/foo/", "foo", "pass");
		$I->assertSame("bar", "bar", "pass");
		$I->assertStringStartsNotWith("a", "banana", "pass");
		$I->assertStringStartsWith("a", "apple", "pass");
		$I->assertTrue(true, "pass");
		$I->comment("asserts backward compatible");
		$I->assertArrayHasKey("apple", ['orange' => 2, 'apple' => 1], "pass");
		$I->assertArrayNotHasKey("kiwi", ['orange' => 2, 'apple' => 1], "pass");
		$I->assertArraySubset([1, 2], [1, 2, 3, 5], "pass");
		$I->assertContains("ab", ['item1' => 'a', 'item2' => 'ab'], "pass");
		$I->assertCount(2, ['a', 'b'], "pass");
		$I->assertEmpty([], "pass");
		$I->assertEquals($text, "Copyright © 2013-2017 Magento, Inc. All rights reserved.", "pass");
		$I->assertEquals("Copyright © 2013-2017 Magento, Inc. All rights reserved.", $text, "pass");
		$I->assertFalse(false, "pass");
		$I->assertFileNotExists("/out.txt", "pass");
		$I->assertFileNotExists($text, "pass");
		$I->assertGreaterOrEquals(2, 5, "pass");
		$I->assertGreaterThan(2, 5, "pass");
		$I->assertGreaterThanOrEqual(2, 5, "pass");
		$I->assertInternalType("string", "xyz", "pass");
		$I->assertInternalType("int", 21, "pass");
		$I->assertInternalType("string", $text, "pass");
		$I->assertLessOrEquals(5, 2, "pass");
		$I->assertLessThan(5, 2, "pass");
		$I->assertLessThanOrEqual(5, 2, "pass");
		$I->assertNotContains("bc", ['item1' => 'a', 'item2' => 'ab'], "pass");
		$I->assertNotContains("bc", $text, "pass");
		$I->assertNotEmpty([1, 2], "pass");
		$I->assertNotEmpty($text, "pass");
		$I->assertNotEquals(2, 5, "pass", 0);
		$I->assertNotNull("abc", "pass");
		$I->assertNotNull($text, "pass");
		$I->assertNotRegExp("/foo/", "bar", "pass");
		$I->assertNotSame("log", "tag", "pass");
		$I->assertRegExp("/foo/", "foo", "pass");
		$I->assertSame("bar", "bar", "pass");
		$I->assertStringStartsNotWith("a", "banana", "pass");
		$I->assertStringStartsWith("a", "apple", "pass");
		$I->assertTrue(true, "pass");
		$I->assertElementContainsAttribute("#username", "class", "admin__control-text");
		$I->assertInstanceOf(User::class, $text, "pass");
		$I->assertNotInstanceOf(User::class, 21, "pass");
		$I->assertFileExists($text, "pass");
		$I->assertIsEmpty($text, "pass");
		$I->assertNull($text, "pass");
		$I->expectException(new MyException('exception msg'), function() {$this->doSomethingBad();});
		$I->comment("string type that use created data");
		$I->assertStringStartsWith("D", PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'lastname', 'test') . ", " . PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'firstname', 'test'), "fail");
		$I->assertStringStartsNotWith("W", PersistedObjectHandler::getInstance()->retrieveEntityField('createData2', 'firstname', 'test') . ", " . PersistedObjectHandler::getInstance()->retrieveEntityField('createData2', 'lastname', 'test'), "pass");
		$I->assertEquals(PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'lastname', 'test'), PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'lastname', 'test'), "pass");
		$I->comment("array type that use created data");
		$I->assertArraySubset([PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'lastname', 'test'), PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'firstname', 'test')], [PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'lastname', 'test'), PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'firstname', 'test'), "1"], "pass");
		$I->assertArraySubset([PersistedObjectHandler::getInstance()->retrieveEntityField('createData2', 'firstname', 'test'), PersistedObjectHandler::getInstance()->retrieveEntityField('createData2', 'lastname', 'test')], [PersistedObjectHandler::getInstance()->retrieveEntityField('createData2', 'firstname', 'test'), PersistedObjectHandler::getInstance()->retrieveEntityField('createData2', 'lastname', 'test'), "1"], "pass");
		$I->assertArrayHasKey("lastname", ['lastname' => PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'lastname', 'test'), 'firstname' => PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'firstname', 'test')], "pass");
		$I->assertArrayHasKey("lastname", ['lastname' => PersistedObjectHandler::getInstance()->retrieveEntityField('createData2', 'lastname', 'test'), 'firstname' => PersistedObjectHandler::getInstance()->retrieveEntityField('createData2', 'firstname', 'test')], "pass");
		$I->assertInstanceOf(User::class, $text, "pass");
		$I->assertNotInstanceOf(User::class, 21, "pass");
		$I->assertFileExists($text, "pass");
		$I->assertFileExists("AssertCest.php", "pass");
		$I->assertIsEmpty($text, "pass");
		$I->assertNull($text, "pass");
		$I->expectException(new MyException('exception msg'), function() {$this->doSomethingBad();});
		$I->fail("fail");
		$I->fail(PersistedObjectHandler::getInstance()->retrieveEntityField('createData2', 'firstname', 'test') . " " . PersistedObjectHandler::getInstance()->retrieveEntityField('createData2', 'lastname', 'test'));
		$I->fail(PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'firstname', 'test') . " " . PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'lastname', 'test'));
		$I->assertElementContainsAttribute("#username", "class", "admin__control-text");
		$I->assertElementContainsAttribute("#username", "name", "login[username]");
		$I->assertElementContainsAttribute("#username", "autofocus", "true");
		$I->assertElementContainsAttribute("#username", "data-validate", "{required:true}");
		$I->assertElementContainsAttribute(".admin__menu-overlay", "style", "display: none;");
		$I->assertElementContainsAttribute(".admin__menu-overlay", "border", "0");
		$I->assertElementContainsAttribute("#username", "value", PersistedObjectHandler::getInstance()->retrieveEntityField('createData2', 'firstname', 'test'));
		$I->assertElementContainsAttribute("#username", "value", PersistedObjectHandler::getInstance()->retrieveEntityField('createData1', 'firstname', 'test'));
		$I->assertEquals("John", "Doe", "pass");
	}
}