mohawk 0.2.1 → 0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Changelog +5 -0
- data/lib/mohawk/accessors.rb +16 -0
- data/lib/mohawk/adapters/uia/text_box.rb +5 -1
- data/lib/mohawk/adapters/uia/window.rb +12 -7
- data/lib/mohawk/version.rb +1 -1
- data/mohawk.gemspec +2 -2
- data/spec/lib/mohawk/button_spec.rb +14 -0
- data/spec/lib/mohawk/checkbox_spec.rb +23 -0
- data/spec/lib/mohawk/combo_box_spec.rb +52 -0
- data/spec/lib/mohawk/control_spec.rb +17 -0
- data/spec/lib/mohawk/label_spec.rb +8 -0
- data/spec/lib/mohawk/link_spec.rb +16 -0
- data/spec/lib/mohawk/menu_spec.rb +20 -0
- data/spec/lib/mohawk/navigation_spec.rb +25 -0
- data/spec/lib/mohawk/radio_spec.rb +22 -0
- data/spec/lib/mohawk/spinner_spec.rb +31 -0
- data/spec/lib/mohawk/text_spec.rb +40 -0
- data/spec/lib/mohawk/tree_view_spec.rb +54 -0
- data/spec/lib/mohawk/window_spec.rb +84 -0
- data/spec/lib/mohawk_spec.rb +25 -0
- data/spec/screens/about.rb +7 -0
- data/spec/screens/data_entry_form.rb +4 -0
- data/spec/screens/main_form.rb +32 -0
- data/spec/spec_helper.rb +19 -1
- data/spec/tabs_spec.rb +26 -0
- metadata +44 -68
- data/features/button.feature +0 -10
- data/features/checkbox.feature +0 -12
- data/features/combo_box.feature +0 -44
- data/features/control.feature +0 -9
- data/features/label.feature +0 -4
- data/features/link.feature +0 -9
- data/features/menu.feature +0 -13
- data/features/mohawk.feature +0 -25
- data/features/navigation.feature +0 -9
- data/features/radio.feature +0 -5
- data/features/spinner.feature +0 -12
- data/features/step_definitions/button_steps.rb +0 -15
- data/features/step_definitions/checkbox_steps.rb +0 -19
- data/features/step_definitions/combo_box_steps.rb +0 -48
- data/features/step_definitions/control_steps.rb +0 -11
- data/features/step_definitions/label_steps.rb +0 -3
- data/features/step_definitions/link_steps.rb +0 -3
- data/features/step_definitions/menu_steps.rb +0 -10
- data/features/step_definitions/mohawk_steps.rb +0 -35
- data/features/step_definitions/navigation_steps.rb +0 -15
- data/features/step_definitions/radio_steps.rb +0 -7
- data/features/step_definitions/spinner_steps.rb +0 -18
- data/features/step_definitions/tabs_steps.rb +0 -23
- data/features/step_definitions/text_steps.rb +0 -15
- data/features/step_definitions/tree_view_steps.rb +0 -35
- data/features/tabs.feature +0 -22
- data/features/text.feature +0 -18
- data/features/tree_view.feature +0 -52
- data/spec/ffi_stub.rb +0 -16
    
        data/Changelog
    CHANGED
    
    | @@ -1,3 +1,8 @@ | |
| 1 | 
            +
            ===	Version 0.3 / 2014-05-23
         | 
| 2 | 
            +
            *		Enhancements
         | 
| 3 | 
            +
            		*	bumping uia dependency to speed up element access when they do not have
         | 
| 4 | 
            +
            		a window handle (i.e. SelectList items, Table rows, etc.)
         | 
| 5 | 
            +
             | 
| 1 6 | 
             
            ===	Version 0.2.1 / 2014-05-14
         | 
| 2 7 | 
             
            *   Enhancements
         | 
| 3 8 | 
             
                *   bumped uia dependency to make menu item selection faster
         | 
    
        data/lib/mohawk/accessors.rb
    CHANGED
    
    | @@ -16,6 +16,19 @@ module Mohawk | |
| 16 16 | 
             
                  end
         | 
| 17 17 | 
             
                end
         | 
| 18 18 |  | 
| 19 | 
            +
                def required_controls(*controls)
         | 
| 20 | 
            +
                  define_method(:wait_until_present) do
         | 
| 21 | 
            +
                    controls.each do |control|
         | 
| 22 | 
            +
                      super()
         | 
| 23 | 
            +
                      begin
         | 
| 24 | 
            +
                        wait_until { send("#{control}_view").exist? }
         | 
| 25 | 
            +
                      rescue Mohawk::Waiter::WaitTimeout
         | 
| 26 | 
            +
                        raise "Control #{control} was not found on the #{self.class} screen"
         | 
| 27 | 
            +
                      end
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 19 32 | 
             
                #
         | 
| 20 33 | 
             
                # Defines a locator indicating a child container that is a descendant of
         | 
| 21 34 | 
             
                # the top-level window
         | 
| @@ -358,6 +371,9 @@ module Mohawk | |
| 358 371 | 
             
                  define_method("#{name}_items") do
         | 
| 359 372 | 
             
                    adapter.tab_control(locator).items
         | 
| 360 373 | 
             
                  end
         | 
| 374 | 
            +
                  define_method("#{name}_view") do
         | 
| 375 | 
            +
                    adapter.tab_control(locator)
         | 
| 376 | 
            +
                  end
         | 
| 361 377 | 
             
                end
         | 
| 362 378 |  | 
| 363 379 | 
             
                def control(name, locator)
         | 
| @@ -14,11 +14,7 @@ module Mohawk | |
| 14 14 | 
             
                    end
         | 
| 15 15 |  | 
| 16 16 | 
             
                    def element
         | 
| 17 | 
            -
                      @element ||=  | 
| 18 | 
            -
                      if @element && @container
         | 
| 19 | 
            -
                        @element = @element.find(@container) || @element
         | 
| 20 | 
            -
                      end
         | 
| 21 | 
            -
                      @element
         | 
| 17 | 
            +
                      @element ||= locate_element
         | 
| 22 18 | 
             
                    end
         | 
| 23 19 |  | 
| 24 20 | 
             
                    def send_keys(*keys)
         | 
| @@ -40,7 +36,7 @@ module Mohawk | |
| 40 36 | 
             
                    end
         | 
| 41 37 |  | 
| 42 38 | 
             
                    def handle
         | 
| 43 | 
            -
                      element.handle
         | 
| 39 | 
            +
                      (locate_element && element.handle) || 0
         | 
| 44 40 | 
             
                    end
         | 
| 45 41 |  | 
| 46 42 | 
             
                    def title
         | 
| @@ -52,12 +48,21 @@ module Mohawk | |
| 52 48 | 
             
                    end
         | 
| 53 49 |  | 
| 54 50 | 
             
                    def present?
         | 
| 55 | 
            -
                       | 
| 51 | 
            +
                      locate_element != nil
         | 
| 56 52 | 
             
                    end
         | 
| 57 53 |  | 
| 58 54 | 
             
                    def wait_until_present
         | 
| 59 55 | 
             
                      wait_until { element }
         | 
| 60 56 | 
             
                    end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    private
         | 
| 59 | 
            +
                    def locate_element
         | 
| 60 | 
            +
                      element = Uia.find_element(@locator)
         | 
| 61 | 
            +
                      if element && @container
         | 
| 62 | 
            +
                        element = element.find(@container) || element
         | 
| 63 | 
            +
                      end
         | 
| 64 | 
            +
                      element
         | 
| 65 | 
            +
                    end
         | 
| 61 66 | 
             
                  end
         | 
| 62 67 | 
             
                end
         | 
| 63 68 | 
             
              end
         | 
    
        data/lib/mohawk/version.rb
    CHANGED
    
    
    
        data/mohawk.gemspec
    CHANGED
    
    | @@ -18,10 +18,10 @@ Gem::Specification.new do |gem| | |
| 18 18 | 
             
              gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
         | 
| 19 19 | 
             
              gem.require_paths = ["lib"]
         | 
| 20 20 |  | 
| 21 | 
            -
              gem.add_dependency 'uia', ' | 
| 21 | 
            +
              gem.add_dependency 'uia', '>= 0.4.4'
         | 
| 22 22 | 
             
              gem.add_dependency 'require_all'
         | 
| 23 23 | 
             
              gem.add_dependency 'page_navigation', '>= 0.7'
         | 
| 24 | 
            -
              gem.add_dependency 'childprocess', '~> 0. | 
| 24 | 
            +
              gem.add_dependency 'childprocess', '~> 0.5'
         | 
| 25 25 |  | 
| 26 26 | 
             
              gem.add_development_dependency 'cucumber'
         | 
| 27 27 | 
             
              gem.add_development_dependency 'rspec', '>= 2.12.0'
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'buttons' do
         | 
| 4 | 
            +
              Given(:main_form) { start_app }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              context 'pressing' do
         | 
| 7 | 
            +
                When { main_form.data_entry_form }
         | 
| 8 | 
            +
                Then { expect(on(DataEntryForm)).to be_present }
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              context '#value' do
         | 
| 12 | 
            +
                Then { main_form.data_entry_form_value == 'Data Entry Form' }
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'checkboxes' do
         | 
| 4 | 
            +
              Given(:main_screen) { start_app }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              Then { main_screen.checkbox_value == 'checkBox' }
         | 
| 7 | 
            +
              Then  { main_screen.checkbox_view.class == Mohawk::Adapters::UIA::CheckBox }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              context 'setting' do
         | 
| 10 | 
            +
                Given(:uncheck) { main_screen.checkbox = false }
         | 
| 11 | 
            +
                Given(:check) { main_screen.checkbox = true }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                context 'checking' do
         | 
| 14 | 
            +
                  When { check }
         | 
| 15 | 
            +
                  Then { main_screen.checkbox == true }
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                context 'un-checking' do
         | 
| 19 | 
            +
                  When { check; uncheck }
         | 
| 20 | 
            +
                  Then { main_screen.checkbox == false }
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'combo boxes' do
         | 
| 4 | 
            +
              Given(:main_form) { start_app }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              context '#combo_box= / #combo_box' do
         | 
| 7 | 
            +
                context 'by index' do
         | 
| 8 | 
            +
                  When { main_form.fruits = 2 }
         | 
| 9 | 
            +
                  Then { main_form.fruits == 'Coconut' }
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                context 'by value' do
         | 
| 13 | 
            +
                  When { main_form.fruits = 'Coconut' }
         | 
| 14 | 
            +
                  Then { main_form.fruits == 'Coconut' }
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                context 'by Regex' do
         | 
| 18 | 
            +
                  When { main_form.fruits = /[Or]an/ }
         | 
| 19 | 
            +
                  Then { main_form.fruits == 'Orange' }
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                context 'multi-select' do
         | 
| 23 | 
            +
                  Given { main_form.toggle_multi }
         | 
| 24 | 
            +
                  When { (0..2).each {|n| main_form.select_fruits_list n } }
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  Then { main_form.fruits_list_selections == ['Apple', 'Orange', 'Mango'] }
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  context '#clear_' do
         | 
| 29 | 
            +
                    context 'by index' do
         | 
| 30 | 
            +
                      When { main_form.clear_fruits_list 2 }
         | 
| 31 | 
            +
                      Then { main_form.fruits_list_selections == ['Apple', 'Orange'] }
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    context 'by value' do
         | 
| 35 | 
            +
                      When { main_form.clear_fruits_list 'Orange' }
         | 
| 36 | 
            +
                      Then { main_form.fruits_list_selections == ['Apple', 'Mango'] }
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                    context 'by Regex' do
         | 
| 40 | 
            +
                      When { main_form.clear_fruits_list /p{2}/ }
         | 
| 41 | 
            +
                      Then { main_form.fruits_list_selections == ['Orange', 'Mango'] }
         | 
| 42 | 
            +
                    end
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              context 'list boxes' do
         | 
| 48 | 
            +
                # ListBox controls are special with regard to raising events
         | 
| 49 | 
            +
                When { main_form.fruits_list = 'Orange' }
         | 
| 50 | 
            +
                Then { main_form.fruits_label == 'Orange' }
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
            end
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'controls' do
         | 
| 4 | 
            +
              Given(:main_screen) { start_app }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              Then { main_screen.month_calendar_view.class == Mohawk::Adapters::UIA::ValueControl }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              context '#control=' do
         | 
| 9 | 
            +
                When { main_screen.month_calendar = '9/28/1979' }
         | 
| 10 | 
            +
                Then { main_screen.month_calendar_value == '9/28/1979 12:00:00 AM' }
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              context '#click_' do
         | 
| 14 | 
            +
                When { main_screen.click_about_control }
         | 
| 15 | 
            +
                Then { on(About) != nil }
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'links' do
         | 
| 4 | 
            +
              Given(:main_form) { start_app }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              Then { main_form.link_label_view.class == Mohawk::Adapters::UIA::Control }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              context '#link_text' do
         | 
| 9 | 
            +
                Then { main_form.link_label_text == 'linkLabel1' }
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              context '#click_link' do
         | 
| 13 | 
            +
                When { main_form.click_link_label }
         | 
| 14 | 
            +
                Then { main_form.link_label_text == 'linkLabel1 (clicked 1 times)' }
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'menus' do
         | 
| 4 | 
            +
              Given(:main_form) { start_app }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              context 'by text' do
         | 
| 7 | 
            +
                When { main_form.menu_item_by_text }
         | 
| 8 | 
            +
                Then { on(About).active? }
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              context 'by path' do
         | 
| 12 | 
            +
                When { main_form.menu_item_by_path }
         | 
| 13 | 
            +
                Then { on(About).active? }
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              context '#click_menu_item' do
         | 
| 17 | 
            +
                When { main_form.click_menu_item_by_path }
         | 
| 18 | 
            +
                Then { on(About).active? }
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Mohawk::Navigation do
         | 
| 4 | 
            +
              context '#on with extra info' do
         | 
| 5 | 
            +
                When { start_app }
         | 
| 6 | 
            +
                Then { on(MainForm, pid: Mohawk.app.pid).present? }
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              context '#navigate_to' do
         | 
| 10 | 
            +
                Given do
         | 
| 11 | 
            +
                  Mohawk::Navigation.routes = {
         | 
| 12 | 
            +
                      :default => [
         | 
| 13 | 
            +
                          [MainForm, :about],
         | 
| 14 | 
            +
                          [About, :close],
         | 
| 15 | 
            +
                          [MainForm, :data_entry_form],
         | 
| 16 | 
            +
                          [DataEntryForm]
         | 
| 17 | 
            +
                      ]
         | 
| 18 | 
            +
                  }
         | 
| 19 | 
            +
                  start_app
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                When(:data_entry_form) { navigate_to(DataEntryForm) }
         | 
| 23 | 
            +
                Then { expect(data_entry_form).to be_present }
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'radio buttons' do
         | 
| 4 | 
            +
              Given(:screen) do
         | 
| 5 | 
            +
                start_app
         | 
| 6 | 
            +
                on(Class.new do
         | 
| 7 | 
            +
                  include Mohawk
         | 
| 8 | 
            +
                  window title: /MainForm/
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  radio(:radio_one, id: 'radioButton1')
         | 
| 11 | 
            +
                  label(:status, id: 'radioButtonLabel')
         | 
| 12 | 
            +
                end)
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              Then { screen.radio_one_view.class == Mohawk::Adapters::UIA::Radio }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              context '#radio' do
         | 
| 18 | 
            +
                When { screen.radio_one }
         | 
| 19 | 
            +
                Then { screen.status == 'Option 1 selected' }
         | 
| 20 | 
            +
                And { screen.radio_one? == true }
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'spinners' do
         | 
| 4 | 
            +
              Given(:screen) do
         | 
| 5 | 
            +
                start_app
         | 
| 6 | 
            +
                on(Class.new do
         | 
| 7 | 
            +
                  include Mohawk
         | 
| 8 | 
            +
                  window(title: /MainForm/)
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  spinner(:spinner, id: 'numericUpDown1')
         | 
| 11 | 
            +
                end)
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              Then { screen.spinner_view.class == Mohawk::Adapters::UIA::Spinner }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              context '#spinner=' do
         | 
| 17 | 
            +
                When { screen.spinner = 50.8 }
         | 
| 18 | 
            +
                Then { screen.spinner == 50.8 }
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              context '#increment_spinner' do
         | 
| 22 | 
            +
                When { 5.times { screen.increment_spinner} }
         | 
| 23 | 
            +
                Then { screen.spinner == 5.0 }
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              context '#decrement_spinner' do
         | 
| 27 | 
            +
                Given { screen.spinner = 10.0 }
         | 
| 28 | 
            +
                When { 3.times { screen.decrement_spinner } }
         | 
| 29 | 
            +
                Then { screen.spinner == 7.0 }
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'text controls' do
         | 
| 4 | 
            +
              Given(:main_form) { start_app }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              Then { main_form.text_field_view.class == Mohawk::Adapters::UIA::TextBox }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              context '#text= / #text' do
         | 
| 9 | 
            +
                context 'edit controls' do
         | 
| 10 | 
            +
                  When { main_form.text_field = 'text we set it to' }
         | 
| 11 | 
            +
                  Then { main_form.text_field == 'text we set it to' }
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                context 'multi-line text fields' do
         | 
| 15 | 
            +
                  When { main_form.multiline_text_field = 'multi-line text we set it to' }
         | 
| 16 | 
            +
                  Then { main_form.multiline_text_field == 'multi-line text we set it to' }
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              context '#clear_text' do
         | 
| 21 | 
            +
                context 'edit controls' do
         | 
| 22 | 
            +
                  Given { main_form.text_field = 'text to be cleared' }
         | 
| 23 | 
            +
                  When { main_form.clear_text_field }
         | 
| 24 | 
            +
                  Then { main_form.text_field == '' }
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                context 'multi-line text fields' do
         | 
| 28 | 
            +
                  Given { main_form.multiline_text_field = 'multiline text to be cleared' }
         | 
| 29 | 
            +
                  When { main_form.clear_multiline_text_field }
         | 
| 30 | 
            +
                  Then { main_form.multiline_text_field == '' }
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              context '#enter_text' do
         | 
| 35 | 
            +
                context 'masked edit controls' do
         | 
| 36 | 
            +
                  When { main_form.enter_masked_text_field 'abc12345willnotgoin6789' }
         | 
| 37 | 
            +
                  Then { main_form.masked_text_field == '123-45-6789' }
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'tree views' do
         | 
| 4 | 
            +
              Given(:main_screen) { start_app }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              Then { main_screen.tree_view_view.class == Mohawk::Adapters::UIA::TreeView }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              context '#tree_view=' do
         | 
| 9 | 
            +
                context 'by index' do
         | 
| 10 | 
            +
                  When { main_screen.tree_view = 1 }
         | 
| 11 | 
            +
                  Then { main_screen.tree_view == 'Parent Two' }
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                context 'by value' do
         | 
| 15 | 
            +
                  When { main_screen.tree_view = 'Parent Two' }
         | 
| 16 | 
            +
                  Then { main_screen.tree_view == 'Parent Two' }
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              context '#tree_view_items' do
         | 
| 21 | 
            +
                Then { main_screen.tree_view_items == ['Parent One', 'Parent Two'] }
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              context '#expand/collapse_tree_view' do
         | 
| 25 | 
            +
                Given(:original_items) { ['Parent One', 'Parent Two'] }
         | 
| 26 | 
            +
                Given(:expected_items) { ['Parent One', 'Child 1', 'Child 2', 'Parent Two'] }
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                context 'by index' do
         | 
| 29 | 
            +
                  When { main_screen.expand_tree_view_item 0 }
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  context 'expand' do
         | 
| 32 | 
            +
                    Then { main_screen.tree_view_items ==  expected_items}
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  context 'collapse' do
         | 
| 36 | 
            +
                    When { main_screen.collapse_tree_view_item 0 }
         | 
| 37 | 
            +
                    Then { main_screen.tree_view_items == original_items }
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                context 'by value' do
         | 
| 42 | 
            +
                  When { main_screen.expand_tree_view_item 'Parent One' }
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  context 'expand' do
         | 
| 45 | 
            +
                    Then { main_screen.tree_view_items ==  expected_items}
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  context 'collapse' do
         | 
| 49 | 
            +
                    When { main_screen.collapse_tree_view_item 'Parent One' }
         | 
| 50 | 
            +
                    Then { main_screen.tree_view_items ==  original_items}
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
| @@ -0,0 +1,84 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Mohawk::Adapters::UIA::Window do
         | 
| 4 | 
            +
              Given(:main_form) { start_app }
         | 
| 5 | 
            +
              Given!(:not_created_form) { MainForm.new }
         | 
| 6 | 
            +
              Given(:about) { main_form.about; on(About) }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              context 'container' do
         | 
| 9 | 
            +
                Given(:container) do
         | 
| 10 | 
            +
                  start_app
         | 
| 11 | 
            +
                  on(Class.new do
         | 
| 12 | 
            +
                    include Mohawk
         | 
| 13 | 
            +
                    window(title: /MainForm/)
         | 
| 14 | 
            +
                    parent(id: 'numericUpDown')
         | 
| 15 | 
            +
                  end)
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                Then { container.adapter.window.title == 'linkLabel1' }
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              context 'children_only' do
         | 
| 22 | 
            +
                Given(:limit_scope) do
         | 
| 23 | 
            +
                  start_app.data_grid_view
         | 
| 24 | 
            +
                  on(Class.new do
         | 
| 25 | 
            +
                    include Mohawk
         | 
| 26 | 
            +
                    window(title: /DataGridViewForm/, children_only: true)
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    button(:close, :value => 'Close')
         | 
| 29 | 
            +
                  end)
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                When(:time_it_took) { Benchmark.measure { limit_scope.close } }
         | 
| 33 | 
            +
                Then { time_it_took.real < 2 }
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              context '#active?' do
         | 
| 37 | 
            +
                Then { not_created_form.active? == false }
         | 
| 38 | 
            +
                Then { main_form.active? == true }
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                context 'inactive --> active' do
         | 
| 41 | 
            +
                  Given { about }
         | 
| 42 | 
            +
                  When { about.close; Mohawk::Waiter.wait_until { !about.present? } }
         | 
| 43 | 
            +
                  Then { not_created_form.active? == true }
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                context 'active --> inactive' do
         | 
| 47 | 
            +
                  Given { expect(main_form).to be_active }
         | 
| 48 | 
            +
                  When { about }
         | 
| 49 | 
            +
                  Then { main_form.active? == false }
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              context '#present?' do
         | 
| 54 | 
            +
                Then { about.present? == true }
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                context 'closing / opening' do
         | 
| 57 | 
            +
                  When { about.close }
         | 
| 58 | 
            +
                  Then { about.present? == false }
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              context '#exist?' do
         | 
| 63 | 
            +
                Then { not_created_form.exist? == false }
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                context 'not there --> there' do
         | 
| 66 | 
            +
                  When { start_app }
         | 
| 67 | 
            +
                  Then { not_created_form.exist? == true }
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                context 'there --> not there' do
         | 
| 71 | 
            +
                  Given { main_form }
         | 
| 72 | 
            +
                  When { main_form.close }
         | 
| 73 | 
            +
                  Then { main_form.exist? == false }
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              context '#has_text?' do
         | 
| 78 | 
            +
                Then { expect(main_form).to have_text 'Assorted UI Elements' }
         | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
              context '#wait_for_control' do
         | 
| 82 | 
            +
                Then { main_form.wait_for_control value: 'Data Entry Form' }
         | 
| 83 | 
            +
              end
         | 
| 84 | 
            +
            end
         | 
    
        data/spec/lib/mohawk_spec.rb
    CHANGED
    
    | @@ -103,6 +103,31 @@ describe Mohawk do | |
| 103 103 | 
             
                end
         | 
| 104 104 | 
             
              end
         | 
| 105 105 |  | 
| 106 | 
            +
              context '#required_controls' do
         | 
| 107 | 
            +
                Given { start_app; Mohawk.timeout = 1 }
         | 
| 108 | 
            +
                Given(:has_controls) do
         | 
| 109 | 
            +
                  Class.new do
         | 
| 110 | 
            +
                    include Mohawk
         | 
| 111 | 
            +
                    window title: /MainForm/
         | 
| 112 | 
            +
                    required_controls :about, :data_grid_view
         | 
| 113 | 
            +
                    button(:about, value: 'About')
         | 
| 114 | 
            +
                    button(:data_grid_view, value: 'Data Grid View')
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
                Given(:missing_controls) do
         | 
| 118 | 
            +
                  Class.new do
         | 
| 119 | 
            +
                    include Mohawk
         | 
| 120 | 
            +
                    window title: /MainForm/
         | 
| 121 | 
            +
                    required_controls :something
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                    button(:something, id: 'notThere')
         | 
| 124 | 
            +
                  end
         | 
| 125 | 
            +
                end
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                Then { on(has_controls) != nil }
         | 
| 128 | 
            +
                Then { expect { on(missing_controls) }.to raise_error /Control something was not found on the #<Class:0x.*> screen/ }
         | 
| 129 | 
            +
              end
         | 
| 130 | 
            +
             | 
| 106 131 | 
             
              context Mohawk::Adapters do
         | 
| 107 132 | 
             
                Given(:screen) { TestScreen.new }
         | 
| 108 133 | 
             
                Given(:window) { double('window').as_null_object }
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            class MainForm
         | 
| 2 | 
            +
              include Mohawk
         | 
| 3 | 
            +
              window title: /MainForm/
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              text(:text_field, id: 'textField')
         | 
| 6 | 
            +
              text(:masked_text_field, :id => 'maskedTextBox')
         | 
| 7 | 
            +
              text(:multiline_text_field, id: 'multiLineTextField')
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              button(:close, id: 'Close')
         | 
| 10 | 
            +
              button(:about, id: 'aboutButton')
         | 
| 11 | 
            +
              button(:data_entry_form, value: 'Data Entry Form')
         | 
| 12 | 
            +
              button(:data_grid_view, value: 'Data Grid View')
         | 
| 13 | 
            +
              button(:toggle_multi, value: 'Toggle Multi-Select')
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              checkbox(:checkbox, id: 'checkBox')
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              combo_box(:fruits, id: 'FruitsComboBox')
         | 
| 18 | 
            +
              select_list(:fruits_list, id: 'FruitListBox')
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              tree_view(:tree_view, id: 'treeView')
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              label(:sample_label, id: 'label1')
         | 
| 23 | 
            +
              label(:fruits_label, :id => 'fruitsLabel')
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              link(:link_label, id: 'linkLabel1')
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              menu_item(:menu_item_by_path, path: ['File', 'Roundabout Way', 'To', 'About'])
         | 
| 28 | 
            +
              menu_item(:menu_item_by_text, text: 'About')
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              control(:month_calendar, id: 'automatableMonthCalendar1')
         | 
| 31 | 
            +
              control(:about_control, id: 'aboutButton')
         | 
| 32 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -4,8 +4,26 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) | |
| 4 4 | 
             
            require 'rspec'
         | 
| 5 5 | 
             
            require 'rspec/mocks'
         | 
| 6 6 | 
             
            require 'rspec-given'
         | 
| 7 | 
            -
            require 'ffi_stub'
         | 
| 8 7 | 
             
            require 'mohawk'
         | 
| 9 8 | 
             
            require 'coveralls'
         | 
| 9 | 
            +
            require 'benchmark'
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            require 'require_all'
         | 
| 12 | 
            +
            require_rel 'screens'
         | 
| 10 13 |  | 
| 11 14 | 
             
            Coveralls.wear!
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            include Mohawk::Navigation
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            def start_app
         | 
| 19 | 
            +
              Mohawk.app_path = 'features/support/WindowsForms.exe'
         | 
| 20 | 
            +
              Mohawk.start
         | 
| 21 | 
            +
              on(MainForm)
         | 
| 22 | 
            +
            end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            RSpec.configure do |config|
         | 
| 25 | 
            +
              config.after(:each) do
         | 
| 26 | 
            +
                Mohawk.stop if Mohawk.app
         | 
| 27 | 
            +
                Mohawk.timeout = 60
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
    
        data/spec/tabs_spec.rb
    ADDED
    
    | @@ -0,0 +1,26 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe 'tabs' do
         | 
| 4 | 
            +
              Given(:screen) { start_app.about; on(About) }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              Then { screen.tab == 'Info' }
         | 
| 7 | 
            +
              Then { screen.tab_items == ['Info', 'Other Info'] }
         | 
| 8 | 
            +
              Then { screen.tab_view.class == Mohawk::Adapters::UIA::TabControl }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              context '#select_tab' do
         | 
| 11 | 
            +
                context 'by index' do
         | 
| 12 | 
            +
                  When { screen.tab = 1 }
         | 
| 13 | 
            +
                  Then { screen.tab == 'Other Info' }
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                context 'by value' do
         | 
| 17 | 
            +
                  When { screen.tab = 'Other Info' }
         | 
| 18 | 
            +
                  When { screen.tab == 'Other Info' }
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                context 'by Regex' do
         | 
| 22 | 
            +
                  When { screen.tab = /[Oo]th/ }
         | 
| 23 | 
            +
                  Then { screen.tab == 'Other Info' }
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         |