<?xml version="1.0" encoding="UTF-8"?>
<!--
 /**
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
-->

<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../../../../../src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
    <test name="AssertTest">
        <before>
            <createData entity="ReplacementPerson" stepKey="createData1"/>
        </before>
        <createData entity="UniquePerson" stepKey="createData2"/>
        <grabTextFrom selector=".copyright>span" stepKey="grabTextFrom1"/>


        <!-- custom asserts -->
        <assertArrayIsSorted sortOrder="asc" stepKey="assertSorted1">
            <array>[1,2,3,4,5]</array>
        </assertArrayIsSorted>

        <!-- asserts without variable replacement -->
        <comment stepKey="c1" userInput="asserts without variable replacement"/>
        <assertArrayHasKey stepKey="assertArrayHasKey" message="pass">
            <expectedResult type="string">apple</expectedResult>
            <actualResult type="const">['orange' => 2, 'apple' => 1]</actualResult>
        </assertArrayHasKey>
        <assertArrayNotHasKey stepKey="assertArrayNotHasKey" message="pass">
            <expectedResult type="string">kiwi</expectedResult>
            <actualResult type="const">['orange' => 2, 'apple' => 1]</actualResult>
        </assertArrayNotHasKey>
        <assertArraySubset stepKey="assertArraySubset" message="pass">
            <expectedResult type="const">[1, 2]</expectedResult>
            <actualResult type="const">[1, 2, 3, 5]</actualResult>
        </assertArraySubset>
        <assertContains stepKey="assertContains" message="pass">
            <expectedResult type="string">ab</expectedResult>
            <actualResult type="const">['item1' => 'a', 'item2' => 'ab']</actualResult>
        </assertContains>
        <assertCount stepKey="assertCount" message="pass">
            <expectedResult type="int">2</expectedResult>
            <actualResult type="const">['a', 'b']</actualResult>
        </assertCount>
        <assertEmpty stepKey="assertEmpty" message="pass">
            <actualResult type="const">[]</actualResult>
        </assertEmpty>
        <assertEquals stepKey="assertEquals1" message="pass">
            <expectedResult type="variable">text</expectedResult>
            <actualResult type="string">Copyright © 2013-2017 Magento, Inc. All rights reserved.</actualResult>
        </assertEquals>
        <assertEquals stepKey="assertEquals2" message="pass">
            <expectedResult type="string">Copyright © 2013-2017 Magento, Inc. All rights reserved.</expectedResult>
            <actualResult type="variable">text</actualResult>
        </assertEquals>
        <assertFalse stepKey="assertFalse1" message="pass">
            <actualResult type="bool">0</actualResult>
        </assertFalse>
        <assertFileNotExists stepKey="assertFileNotExists1" message="pass">
            <actualResult type="string">/out.txt</actualResult>
        </assertFileNotExists>
        <assertFileNotExists stepKey="assertFileNotExists2" message="pass">
            <actualResult type="variable">text</actualResult>
        </assertFileNotExists>
        <assertGreaterOrEquals stepKey="assertGreaterOrEquals" message="pass">
            <expectedResult type="int">2</expectedResult>
            <actualResult type="int">5</actualResult>
        </assertGreaterOrEquals>
        <assertGreaterThan stepKey="assertGreaterthan" message="pass">
            <expectedResult type="int">2</expectedResult>
            <actualResult type="int">5</actualResult>
        </assertGreaterThan>
        <assertGreaterThanOrEqual stepKey="assertGreaterThanOrEqual" message="pass">
            <expectedResult type="int">2</expectedResult>
            <actualResult type="int">5</actualResult>
        </assertGreaterThanOrEqual>
        <assertInternalType stepKey="assertInternalType1" message="pass">
            <expectedResult type="string">string</expectedResult>
            <actualResult type="string">xyz</actualResult>
        </assertInternalType>
        <assertInternalType stepKey="assertInternalType2" message="pass">
            <expectedResult type="string">int</expectedResult>
            <actualResult type="int">21</actualResult>
        </assertInternalType>
        <assertInternalType stepKey="assertInternalType3" message="pass">
            <expectedResult type="string">string</expectedResult>
            <actualResult type="variable">text</actualResult>
        </assertInternalType>
        <assertLessOrEquals stepKey="assertLessOrEquals" message="pass">
            <expectedResult type="int">5</expectedResult>
            <actualResult type="int">2</actualResult>
        </assertLessOrEquals>
        <assertLessThan stepKey="assertLessThan" message="pass">
            <expectedResult type="int">5</expectedResult>
            <actualResult type="int">2</actualResult>
        </assertLessThan>
        <assertLessThanOrEqual stepKey="assertLessThanOrEquals" message="pass">
            <expectedResult type="int">5</expectedResult>
            <actualResult type="int">2</actualResult>
        </assertLessThanOrEqual>
        <assertNotContains stepKey="assertNotContains1" message="pass">
            <expectedResult type="string">bc</expectedResult>
            <actualResult type="const">['item1' => 'a', 'item2' => 'ab']</actualResult>
        </assertNotContains>
        <assertNotContains stepKey="assertNotContains2" message="pass">
            <expectedResult type="string">bc</expectedResult>
            <actualResult type="variable">text</actualResult>
        </assertNotContains>
        <assertNotEmpty stepKey="assertNotEmpty1" message="pass">
            <actualResult type="const">[1, 2]</actualResult>
        </assertNotEmpty>
        <assertNotEmpty stepKey="assertNotEmpty2" message="pass">
            <actualResult type="variable">text</actualResult>
        </assertNotEmpty>
        <assertNotEquals stepKey="assertNotEquals" message="pass" delta="">
            <expectedResult type="int">2</expectedResult>
            <actualResult type="int">5</actualResult>
        </assertNotEquals>
        <assertNotNull stepKey="assertNotNull1" message="pass">
            <actualResult type="string">abc</actualResult>
        </assertNotNull>
        <assertNotNull stepKey="assertNotNull2" message="pass">
            <actualResult type="variable">text</actualResult>
        </assertNotNull>
        <assertNotRegExp stepKey="assertNotRegExp" message="pass">
            <expectedResult type="string">/foo/</expectedResult>
            <actualResult type="string">bar</actualResult>
        </assertNotRegExp>
        <assertNotSame stepKey="assertNotSame" message="pass">
            <expectedResult type="string">log</expectedResult>
            <actualResult type="string">tag</actualResult>
        </assertNotSame>
        <assertRegExp stepKey="assertRegExp" message="pass">
            <expectedResult type="string">/foo/</expectedResult>
            <actualResult type="string">foo</actualResult>
        </assertRegExp>
        <assertSame stepKey="assertSame" message="pass">
            <expectedResult type="string">bar</expectedResult>
            <actualResult type="string">bar</actualResult>
        </assertSame>
        <assertStringStartsNotWith stepKey="assertStringStartsNotWith" message="pass">
            <expectedResult type="string">a</expectedResult>
            <actualResult type="string">banana</actualResult>
        </assertStringStartsNotWith>
        <assertStringStartsWith stepKey="assertStringStartsWith" message="pass">
            <expectedResult type="string">a</expectedResult>
            <actualResult type="string">apple</actualResult>
        </assertStringStartsWith>
        <assertTrue stepKey="assertTrue" message="pass">
            <actualResult type="bool">1</actualResult>
        </assertTrue>

        <!-- asserts backward compatible -->
        <comment stepKey="commentBackwardCompatible" userInput="asserts backward compatible"/>
        <assertArrayHasKey stepKey="assertArrayHasKeyBackwardCompatible" expected="apple" expectedType="string" actual="['orange' => 2, 'apple' => 1]" actualType="const" message="pass"/>
        <assertArrayNotHasKey stepKey="assertArrayNotHasKeyBackwardCompatible" expected="kiwi" expectedType="string" actual="['orange' => 2, 'apple' => 1]" message="pass"/>
        <assertArraySubset stepKey="assertArraySubsetBackwardCompatible" expected="[1, 2]" actual="[1, 2, 3, 5]" message="pass"/>
        <assertContains stepKey="assertContainsBackwardCompatible" expected="ab" expectedType="string" actual="['item1' => 'a', 'item2' => 'ab']" message="pass"/>
        <assertCount stepKey="assertCountBackwardCompatible" expected="2" expectedType="int" actual="['a', 'b']" message="pass"/>
        <assertEmpty stepKey="assertEmptyBackwardCompatible" actual="[]" message="pass"/>
        <assertEquals stepKey="assertEquals1BackwardCompatible" expected="text" expectedType="variable" actual="Copyright © 2013-2017 Magento, Inc. All rights reserved." actualType="string" message="pass"/>
        <assertEquals stepKey="assertEquals2BackwardCompatible" expected="Copyright © 2013-2017 Magento, Inc. All rights reserved." expectedType="string" actual="text" actualType="variable" message="pass"/>
        <assertFalse stepKey="assertFalse1BackwardCompatible" actual="0" actualType="bool" message="pass"/>
        <assertFileNotExists stepKey="assertFileNotExists1BackwardCompatible" actual="/out.txt" actualType="string" message="pass"/>
        <assertFileNotExists stepKey="assertFileNotExists2BackwardCompatible" actual="$text" actualType="variable" message="pass"/>
        <assertGreaterOrEquals stepKey="assertGreaterOrEqualsBackwardCompatible" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
        <assertGreaterThan stepKey="assertGreaterThanBackwardCompatible" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
        <assertGreaterThanOrEqual stepKey="assertGreaterThanOrEqualBackwardCompatible" expected="2" expectedType="int" actual="5" actualType="int" message="pass"/>
        <assertInternalType stepKey="assertInternalType1BackwardCompatible" expected="string" expectedType="string" actual="xyz" actualType="string" message="pass"/>
        <assertInternalType stepKey="assertInternalType2BackwardCompatible" expected="int" expectedType="string" actual="21" actualType="int" message="pass"/>
        <assertInternalType stepKey="assertInternalType3BackwardCompatible" expected="string" expectedType="string" actual="$text" actualType="variable" message="pass"/>
        <assertLessOrEquals stepKey="assertLessOrEqualBackwardCompatibles" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
        <assertLessThan stepKey="assertLessThanBackwardCompatible" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
        <assertLessThanOrEqual stepKey="assertLessThanOrEqualBackwardCompatible" expected="5" expectedType="int" actual="2" actualType="int" message="pass"/>
        <assertNotContains stepKey="assertNotContains1BackwardCompatible" expected="bc" expectedType="string" actual="['item1' => 'a', 'item2' => 'ab']" message="pass"/>
        <assertNotContains stepKey="assertNotContains2BackwardCompatible" expected="bc" expectedType="string" actual="text" actualType="variable" message="pass"/>
        <assertNotEmpty stepKey="assertNotEmpty1BackwardCompatible" actual="[1, 2]" message="pass"/>
        <assertNotEmpty stepKey="assertNotEmpty2BackwardCompatible" actual="text" actualType="variable" message="pass"/>
        <assertNotEquals stepKey="assertNotEqualsBackwardCompatible" expected="2" expectedType="int" actual="5" actualType="int" message="pass" delta=""/>
        <assertNotNull stepKey="assertNotNull1BackwardCompatible" actual="abc" actualType="string" message="pass"/>
        <assertNotNull stepKey="assertNotNull2BackwardCompatible" actual="text" actualType="variable" message="pass"/>
        <assertNotRegExp stepKey="assertNotRegExpBackwardCompatible" expected="/foo/" expectedType="string" actual="bar" actualType="string" message="pass"/>
        <assertNotSame stepKey="assertNotSameBackwardCompatible" expected="log" expectedType="string" actual="tag" actualType="string" message="pass"/>
        <assertRegExp stepKey="assertRegExpBackwardCompatible" expected="/foo/" expectedType="string" actual="foo" actualType="string" message="pass"/>
        <assertSame stepKey="assertSameBackwardCompatible" expected="bar" expectedType="string" actual="bar" actualType="string" message="pass"/>
        <assertStringStartsNotWith stepKey="assertStringStartsNotWithBackwardCompatible" expected="a" expectedType="string" actual="banana" actualType="string" message="pass"/>
        <assertStringStartsWith stepKey="assertStringStartsWithBackwardCompatible" expected="a" expectedType="string" actual="apple" actualType="string" message="pass"/>
        <assertTrue stepKey="assertTrueBackwardCompatible" actual="1" actualType="bool" message="pass"/>
        <assertElementContainsAttribute selector="#username" attribute="class" expectedValue="admin__control-text" stepKey="assertElementContainsAttributeBackwardCompatible"/>
        <assertInstanceOf stepKey="assertInstanceOfBackwardCompatible" expected="User::class" actual="text" actualType="variable" message="pass"/>
        <assertNotInstanceOf stepKey="assertNotInstanceOfBackwardCompatible" expected="User::class" actual="21" actualType="int" message="pass"/>
        <assertFileExists stepKey="assertFileExistsBackwardCompatible" actual="text" actualType="variable" message="pass"/>
        <assertIsEmpty stepKey="assertIsEmptyBackwardCompatible" actual="text" actualType="variable" message="pass"/>
        <assertNull stepKey="assertNullBackwardCompatible" actual="text" actualType="variable" message="pass"/>
        <expectException stepKey="expectExceptionBackwardCompatible" expected="new MyException('exception msg')" actual="function() {$this->doSomethingBad();}"/>

        <!-- string type that use created data -->
        <comment stepKey="c2" userInput="string type that use created data"/>
        <assertStringStartsWith stepKey="assert1" message="fail">
            <expectedResult type="string">D</expectedResult>
            <actualResult type="string">$$createData1.lastname$$, $$createData1.firstname$$</actualResult>
        </assertStringStartsWith>
        <assertStringStartsNotWith stepKey="assert2" message="pass">
            <expectedResult type="string">W</expectedResult>
            <actualResult type="string">$createData2.firstname$, $createData2.lastname$</actualResult>
        </assertStringStartsNotWith>
        <assertEquals stepKey="assert5" message="pass">
            <expectedResult type="string">$$createData1.lastname$$</expectedResult>
            <actualResult type="string">$$createData1.lastname$$</actualResult>
        </assertEquals>

        <!-- array type that use created data -->
        <comment stepKey="c3" userInput="array type that use created data"/>
        <assertArraySubset stepKey="assert9" message="pass">
            <expectedResult type="array">[$$createData1.lastname$$, $$createData1.firstname$$]</expectedResult>
            <actualResult type="array">[$$createData1.lastname$$, $$createData1.firstname$$, 1]</actualResult>
        </assertArraySubset>
        <assertArraySubset stepKey="assert10" message="pass">
            <expectedResult type="array">[$createData2.firstname$, $createData2.lastname$]</expectedResult>
            <actualResult type="array">[$createData2.firstname$, $createData2.lastname$, 1]</actualResult>
        </assertArraySubset>
        <assertArrayHasKey stepKey="assert3" message="pass">
            <expectedResult type="string">lastname</expectedResult>
            <actualResult type="array">['lastname' => $$createData1.lastname$$, 'firstname' => $$createData1.firstname$$]</actualResult>
        </assertArrayHasKey>
        <assertArrayHasKey stepKey="assert4" message="pass">
            <expectedResult type="string">lastname</expectedResult>
            <actualResult type="array">['lastname' => $createData2.lastname$, 'firstname' => $createData2.firstname$]</actualResult>
        </assertArrayHasKey>

        <!-- this section can only be generated and cannot run -->
        <assertInstanceOf stepKey="assertInstanceOf" message="pass">
            <expectedResult type="const">User::class</expectedResult>
            <actualResult type="variable">text</actualResult>
        </assertInstanceOf>
        <assertNotInstanceOf stepKey="assertNotInstanceOf" message="pass">
            <expectedResult type="const">User::class</expectedResult>
            <actualResult type="int">21</actualResult>
        </assertNotInstanceOf>
        <assertFileExists stepKey="assertFileExists2" message="pass">
            <actualResult type="variable">text</actualResult>
        </assertFileExists>
        <assertFileExists stepKey="assertFileExists3" message="pass">
            <actualResult type="string">AssertCest.php</actualResult>
        </assertFileExists>
        <assertIsEmpty stepKey="assertIsEmpty" message="pass">
            <actualResult type="variable">text</actualResult>
        </assertIsEmpty>
        <assertNull stepKey="assertNull" message="pass">
            <actualResult type="variable">text</actualResult>
        </assertNull>
        <expectException stepKey="expectException">
            <expectedResult type="const">new MyException('exception msg')</expectedResult>
            <actualResult type="const">function() {$this->doSomethingBad();}</actualResult>
        </expectException>
        <fail stepKey="fail" message="fail"/>
        <fail stepKey="assert7" message="$createData2.firstname$ $createData2.lastname$"/>
        <fail stepKey="assert8" message="$$createData1.firstname$$ $$createData1.lastname$$"/>

        <!-- assertElementContainsAttribute examples -->
        <assertElementContainsAttribute stepKey="assertElementContainsAttribute1" selector="#username" attribute="class">
            <expectedResult type="string">admin__control-text</expectedResult>
        </assertElementContainsAttribute>
        <assertElementContainsAttribute stepKey="assertElementContainsAttribute2" selector="#username" attribute="name">
            <expectedResult type="string">login[username]</expectedResult>
        </assertElementContainsAttribute>
        <assertElementContainsAttribute stepKey="assertElementContainsAttribute3" selector="#username" attribute="autofocus">
            <expectedResult type="string">true</expectedResult>
        </assertElementContainsAttribute>
        <assertElementContainsAttribute stepKey="assertElementContainsAttribute4" selector="#username" attribute="data-validate">
            <expectedResult type="string">{required:true}</expectedResult>
        </assertElementContainsAttribute>
        <assertElementContainsAttribute stepKey="assertElementContainsAttribute5" selector=".admin__menu-overlay" attribute="style">
            <expectedResult type="string">display: none;</expectedResult>
        </assertElementContainsAttribute>
        <assertElementContainsAttribute stepKey="assertElementContainsAttribute6" selector=".admin__menu-overlay" attribute="border">
            <expectedResult type="string">0</expectedResult>
        </assertElementContainsAttribute>
        <assertElementContainsAttribute stepKey="assertElementContainsAttribute7" selector="#username" attribute="value">
            <expectedResult type="const">$createData2.firstname$</expectedResult>
        </assertElementContainsAttribute>
        <assertElementContainsAttribute stepKey="assertElementContainsAttribute8" selector="#username" attribute="value">
            <expectedResult type="const">$$createData1.firstname$$</expectedResult>
        </assertElementContainsAttribute>

        <!-- assert entity resolution -->
        <assertEquals stepKey="assertEqualsEntity" message="pass">
            <expectedResult type="string">{{simpleData.firstname}}</expectedResult>
            <actualResult type="string">{{simpleData.lastname}}</actualResult>
        </assertEquals>
    </test>
</tests>
