diff --git a/lib/behat/classes/partial_named_selector.php b/lib/behat/classes/partial_named_selector.php index f0d0ddcb96e..99c7d1b12a6 100644 --- a/lib/behat/classes/partial_named_selector.php +++ b/lib/behat/classes/partial_named_selector.php @@ -86,6 +86,7 @@ class behat_partial_named_selector extends \Behat\Mink\Selector\PartialNamedSele */ protected static $allowedselectors = array( 'activity' => 'activity', + 'actionmenu' => 'actionmenu', 'badge' => 'badge', 'block' => 'block', 'button' => 'button', @@ -138,6 +139,17 @@ class behat_partial_named_selector extends \Behat\Mink\Selector\PartialNamedSele protected static $moodleselectors = array( 'activity' => << << <<ensure_node_is_visible($node); $node->click(); } + + /** + * Select a specific item in an action menu. + * + * @When /^I choose the "(?P(?:[^"]|\\")*)" item in the "(?P(?:[^"]|\\")*)" action menu$/ + * @param string $item The item to choose + * @param string $actionmenu The text used in the description of the action menu + */ + public function i_choose_in_the_named_menu(string $item, string $actionmenu): void { + $menu = $this->find('actionmenu', $actionmenu); + $this->select_item_in_action_menu($item, $menu); + } + + /** + * Select a specific item in an action menu within a container. + * + * @When /^I choose the "(?P(?:[^"]|\\")*)" item in the "(?P(?:[^"]|\\")*)" action menu of the "(?P(?:[^"]|\\")*)" "(?P(?:[^"]|\\")*)"$/ + * @param string $item The item to choose + * @param string $actionmenu The text used in the description of the action menu + * @param string|NodeElement $locator The identifer used for the container + * @param string $selector The type of container to locate + */ + public function i_choose_in_the_named_menu_in_container(string $item, string $actionmenu, $locator, $selector): void { + $container = $this->find($selector, $locator); + $menu = $this->find('actionmenu', $actionmenu, false, $container); + $this->select_item_in_action_menu($item, $menu); + } + + /** + * Select an item in the specified menu. + * + * Note: This step does work both with, and without, JavaScript. + * + * @param string $item Item string value + * @param NodeElement $menu The menu NodeElement to select from + */ + protected function select_item_in_action_menu(string $item, NodeElement $menu): void { + if ($this->running_javascript()) { + // Open the menu by clicking on the trigger. + $this->execute( + 'behat_general::i_click_on', + [$menu, "NodeElement"] + ); + } + + // Select the menu item. + $this->execute( + 'behat_general::i_click_on_in_the', + [$item, "link", $menu, "NodeElement"] + ); + } + + /** + * The action menu item should not exist. + * + * @Then /^the "(?P(?:[^"]|\\")*)" item should not exist in the "(?P(?:[^"]|\\")*)" action menu$/ + * @param string $item The item to check + * @param string $actionmenu The text used in the description of the action menu + */ + public function item_should_not_exist(string $item, string $actionmenu): void { + $menu = $this->find('actionmenu', $actionmenu); + $this->execute('behat_general::should_not_exist_in_the', [ + $item, 'link', + $menu, 'NodeElement' + ]); + } + + /** + * The action menu item should not exist within a container. + * + * @Then /^the "(?P(?:[^"]|\\")*)" item should not exist in the "(?P(?:[^"]|\\")*)" action menu of the "(?P(?:[^"]|\\")*)" "(?P(?:[^"]|\\")*)"$/ + * @param string $item The item to check + * @param string $actionmenu The text used in the description of the action menu + * @param string|NodeElement $locator The identifer used for the container + * @param string $selector The type of container to locate + */ + public function item_should_not_exist_in_the(string $item, string $actionmenu, $locator, $selector): void { + $container = $this->find($selector, $locator); + $menu = $this->find('actionmenu', $actionmenu, false, $container); + $this->execute('behat_general::should_not_exist_in_the', [ + $item, 'link', + $menu, 'NodeElement' + ]); + } + + + /** + * The action menu item should exist. + * + * @Then /^the "(?P(?:[^"]|\\")*)" item should exist in the "(?P(?:[^"]|\\")*)" action menu$/ + * @param string $item The item to check + * @param string $actionmenu The text used in the description of the action menu + */ + public function item_should_exist(string $item, string $actionmenu): void { + $menu = $this->find('actionmenu', $actionmenu); + $this->execute('behat_general::should_exist_in_the', [ + $item, 'link', + $menu, 'NodeElement' + ]); + } + + /** + * The action menu item should exist within a container. + * + * @Then /^the "(?P(?:[^"]|\\")*)" item should exist in the "(?P(?:[^"]|\\")*)" action menu of the "(?P(?:[^"]|\\")*)" "(?P(?:[^"]|\\")*)"$/ + * @param string $item The item to check + * @param string $actionmenu The text used in the description of the action menu + * @param string|NodeElement $locator The identifer used for the container + * @param string $selector The type of container to locate + */ + public function item_should_exist_in_the(string $item, string $actionmenu, $locator, $selector): void { + $container = $this->find($selector, $locator); + $menu = $this->find('actionmenu', $actionmenu, false, $container); + $this->execute('behat_general::should_exist_in_the', [ + $item, 'link', + $menu, 'NodeElement' + ]); + } }