jarmo / RAutomation

RAutomation
MIT License
100 stars 33 forks source link

64 bit support (win32 adapter only) #136

Closed bensandland closed 1 year ago

bensandland commented 2 years ago

So I have been working on making RAutomation work on Ruby 64bit.

Currently it only works using the win32 adapter, I am not sure sure how much work would be needed to support 64bit using UIA, although I did read that @leviwilson mentioned in #118 that he was working on 64bit support, but I haven't investigated further. Would you prefer if I made that adapter work too, before merging this into master?

There are a few specs which are not passing, but one of them is due to using ISO keyboard layout in Windows. If I switch to US ANSI it works. The spec is "send arbitrary characters and control keys" located in win_32/window_spec.rb The other one is "Windows#windows with parameters returns all matching windows" located in win_32/windows_spec.rb - it always returns 1 instead of 2, but this is the case on both 32bit and 64bit.

When building the gem it will move the DLLs into 'Release' directory, depending on platform. If none is specified it will build based on the platform the command was executed from.

There are a few changes to the .sln files, which I have added to a .txt - maybe these should be included in a changelog?

Another thing is that I had to downgrade the build tools version from 142 to 141 - because I only have license for VS 2017.

Let me know if there is anything you have questions about or would like to have changed.

jarmo commented 2 years ago

Thanks! Great work. I just recently thought that it's sad that this library still only works on 32 bit Ruby.

I've looked over the code and added some questions/comments, but did it commit by commit due to big amount of changes.

Currently it only works using the win32 adapter, I am not sure sure how much work would be needed to support 64bit using UIA, although I did read that @leviwilson mentioned in https://github.com/jarmo/RAutomation/issues/118 that he was working on 64bit support, but I haven't investigated further. Would you prefer if I made that adapter work too, before merging this into master?

I think that we can make a separate release with just win32 adapter 64 bit support. However, I would also update README.md, which currently states that 64bit Ruby does not work at all. I would basically remove this whole section and write after each available adapter its supported platforms.

There are a few specs which are not passing, but one of them is due to using ISO keyboard layout in Windows. If I switch to US ANSI it works. The spec is "send arbitrary characters and control keys" located in win_32/window_spec.rb

Are you saying that it fails on your machine because your system does not use the same layout as spec expects? In other words, spec keyboard layout assumption is different from your keyboard layout?

The other one is "Windows#windows with parameters returns all matching windows" located in win_32/windows_spec.rb - it always returns 1 instead of 2, but this is the case on both 32bit and 64bit.

Added a comment/question about this directly into the code diff.

When building the gem it will move the DLLs into 'Release' directory, depending on platform. If none is specified it will build based on the platform the command was executed from.

If I remember correctly then DLLs are pre-built into the gem and when someone installs a gem via gem install rautomation then they don't need to build anything themselves, right? Does this mean that I can still build one version of this gem having support for x86 and x64 (as long as I'm building on a machine with 64bit architecture) and then just correct version of dll-s will be loaded during runtime depending on the platform?

There are a few changes to the .sln files, which I have added to a .txt - maybe these should be included in a changelog?

Added a separate question/comment about this into code diff.

jarmo commented 2 years ago

Found first problem. When checking out your changes and trying to run whatever command which parses and executes gemspec then it will crash since I have not built external libraries yet. Here's an example:

$ bundle
Moving x64 dll's into 'Release' folder..

[!] There was an error parsing `Gemfile`:
[!] There was an error while loading `rautomation.gemspec`: No such file or directory @ rb_sysopen - ext/IAccessibleDLL/x64Release/IAccessibleDLL.dll. Bundler cannot continue.

 #  from rautomation.gemspec:29
 #  -------------------------------------------
 #    s.add_development_dependency("github-markup", "~> 3.0")
 >  end
 #  # -*- encoding: utf-8 -*-
 #  -------------------------------------------
. Bundler cannot continue.

 #  from Gemfile:3
 #  -------------------------------------------
 #
 >  gemspec
 #  source "https://rubygems.org"
 #  -------------------------------------------
jarmo commented 2 years ago

If I remember correctly then DLLs are pre-built into the gem and when someone installs a gem via gem install rautomation then they don't need to build anything themselves, right? Does this mean that I can still build one version of this gem having support for x86 and x64 (as long as I'm building on a machine with 64bit architecture) and then just correct version of dll-s will be loaded during runtime depending on the platform?

I've just understood that I probably need to build two versions of the gem and then publish them to the Rubygems, right? In that case this question has become MOOT. It would be better though to only have one version of the gem and I think that this might be possible with this gem since we're loading platform dependent code during runtime. This would simplify the build and release process. Since I've never handled a gem with multiple platform requirements, then am I on the right track?

jarmo commented 2 years ago

Can't build or run any commands anymore, even on 32bit Ruby, due to the following error:

LINK : fatal error LNK1104: cannot open file 'MSCOREE.lib' [ext\UiaDll\UiaDll\UiaDll.vcxproj]

Can it be related with the build tools/SDK changes?

Can't remember how I installed tools/SDK in the past, but I know that I don't have any license as well and used some free version, which was enough at the time. Is that not possible anymore so that we don't have to downgrade anything related to building?

bensandland commented 2 years ago

If I remember correctly then DLLs are pre-built into the gem and when someone installs a gem via gem install rautomation then they don't need to build anything themselves, right? Does this mean that I can still build one version of this gem having support for x86 and x64 (as long as I'm building on a machine with 64bit architecture) and then just correct version of dll-s will be loaded during runtime depending on the platform?

Correct. The dll's are included in the gem after it has been built. It would be possible to have a singular gem that supports both platforms, however this means we would need to include all dll's in the gem.

When loading the dll's with FFI we would need to load the appropriate files depending on platform. This could be done in a fashion similar to the way the platform specific function hooks are called (e.g. LoadLibraryA) I suspect some additional logic on how the specs are executed also would be needed, to make sure the correct platform is being tested.

This would mean that its possible to have a singular gem build, making the release and test process simpler.

If you want I can work on implementing it like this?

bensandland commented 2 years ago

Found first problem. When checking out your changes and trying to run whatever command which parses and executes gemspec then it will crash since I have not built external libraries yet. Here's an example:

$ bundle
Moving x64 dll's into 'Release' folder..

[!] There was an error parsing `Gemfile`:
[!] There was an error while loading `rautomation.gemspec`: No such file or directory @ rb_sysopen - ext/IAccessibleDLL/x64Release/IAccessibleDLL.dll. Bundler cannot continue.

 #  from rautomation.gemspec:29
 #  -------------------------------------------
 #    s.add_development_dependency("github-markup", "~> 3.0")
 >  end
 #  # -*- encoding: utf-8 -*-
 #  -------------------------------------------
. Bundler cannot continue.

 #  from Gemfile:3
 #  -------------------------------------------
 #
 >  gemspec
 #  source "https://rubygems.org"
 #  -------------------------------------------

I see. I will make sure an error is raised instead, saying that the external dependencies needs to be built.

Can't build or run any commands anymore, even on 32bit Ruby, due to the following error:

LINK : fatal error LNK1104: cannot open file 'MSCOREE.lib' [ext\UiaDll\UiaDll\UiaDll.vcxproj]

Can it be related with the build tools/SDK changes?

Can't remember how I installed tools/SDK in the past, but I know that I don't have any license as well and used some free version, which was enough at the time. Is that not possible anymore so that we don't have to downgrade anything related to building?

I had to use build tools v141 instead of v142 since I only have a license for VS 2017. I can try installing a Community version instead and make sure v142 is still used.

jarmo commented 2 years ago

This would mean that its possible to have a singular gem build, making the release and test process simpler.

I can't remember anymore if Rubygems supported having two gems - one for each platform and will be installed automatically upon gem install or bundle install depending on the used platform. If that's the case then having two gems would be okay too. However if installation process gets more complicated where user has to specify the exact gem to be installed then one gem would be necessary. TLDR; It should be easy to install this gem without any extra effort from the end-user.

I see. I will make sure an error is raised instead, saying that the external dependencies needs to be built.

Even better would be to try to build these dependencies automatically when they have not built instead of raising an error. Try to implement a solution like this instead when possible.

bensandland commented 2 years ago

This would mean that its possible to have a singular gem build, making the release and test process simpler.

I can't remember anymore if Rubygems supported having two gems - one for each platform and will be installed automatically upon gem install or bundle install depending on the used platform. If that's the case then having two gems would be okay too. However if installation process gets more complicated where user has to specify the exact gem to be installed then one gem would be necessary. TLDR; It should be easy to install this gem without any extra effort from the end-user.

RubyGems does support gems made for multiple platforms. When a user executes a gem install command it'll get the platform that corresponds with the system the command was executed from. In this case it means we need 2 versions, but if anyone were to make eg. a Unix adapter that would of course increase this number.

So from user perspective it is the exact same way for installing the gem. They can also specify the platform with the --platform flag if need be.

I see. I will make sure an error is raised instead, saying that the external dependencies needs to be built.

Even better would be to try to build these dependencies automatically when they have not built instead of raising an error. Try to implement a solution like this instead when possible.

Makes sense. I'll need to move some code a bit then, cause I don't think I can call a function within the Rakefile from the Gemspec.

bensandland commented 2 years ago

I have updated the Gemspec so any missing externals now are built. I have also upped the build tools version to 143 from 141. I ended up installing Visual Studio 2022 Community to do this. Let me know if you have any problems building these.

I suspect the Rakefile could use some refactoring, its starting to get a little cluttered and I also have a bit of repeated code since I needed a function to build the dependencies elsewhere. If you have any preferences or suggestions regarding this I'd love to hear them.

bensandland commented 2 years ago

@jarmo any progress on this? let me know if there is anything I can do to help.

jarmo commented 2 years ago

@bensandland I'm busy with other projects in my life now and can't look into it right now. I'll try to give it a look in two weeks time.

jarmo commented 2 years ago

@bensandland sorry for keeping you waiting. Tried to run specs, but failed:

> rake spec
...
gem build rautomation --platform x86-mingw32
ERROR:  While executing gem ... (OptionParser::InvalidOption)
    invalid option: --platform
rake aborted!
Command failed with status (1): [gem build rautomation --platform x86-mingw...]
Rakefile:44:in `block (2 levels) in <top (required)>'

I have a slightly older version of Ruby:

> ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x64-mingw32]

Same problem also with 32 bit Ruby:

> ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [i386-mingw32]

Notes to myself and others who would be willing to build external dependencies - I needed to install .NET Framework 4.7.2 Developer Pack and 2022 Build Tools with Desktop development with C++ feature to successfully build dependencies with msbuild.

jarmo commented 2 years ago

I don't seem to have a --platform flag for my gem build command. My Rubygems version is 3.0.3. What version should I have?

jarmo commented 2 years ago

Got specs running after upgrading Rubygems:

> gem update --system --no-document
...
RubyGems system software updated

> gem -v
3.3.24
jarmo commented 2 years ago

I seem to be having problems running specs on a clean git clone.

rake build hangs forever on the line:

RestorePackages:
  "C:\REDACTED\RAutomation\ext\WindowsForms\.nuget\NuGet.exe" install "C:\REDACTED\RAutomation\ext\WindowsForms\WindowsForms\packages.config" -source ""  -NonInteractive  -solutionDir "C:\REDACTED\RAutomation\ext\WindowsForms\ "

Can you try if it works for you?

Create a clean state under ext to remove anything ever built:

rm -rf ext
git reset --hard HEAD

Maybe its just today, but maybe not.

jarmo commented 2 years ago

Okay, managed to build external dependencies by upgrading nuget to 4.1.0.

However, rake build still fails:

Invalid gemspec in [rautomation.gemspec]: No such file or directory @ rb_sysopen - ext/IAccessibleDLL/x86Release/IAccessibleDLL.dll
ERROR:  Error loading gemspec. Aborting.
rake aborted!

I only see x64Release directory under ext/IAccessibleDLL directory.

bensandland commented 2 years ago

Thanks for replying.

I'll look into it ASAP, will let you know when I have it fixed. Probably some time tomorrow or early next week.

bensandland commented 2 years ago

I have tried to create a VM running Windows 10 to reproduce these errors. It is very slow however and Visual Studio does not seem to work properly.. So I am not able to reproduce some of these errors as of this moment.

Okay, managed to build external dependencies by upgrading nuget to 4.1.0.

However, rake build still fails:

Invalid gemspec in [rautomation.gemspec]: No such file or directory @ rb_sysopen - ext/IAccessibleDLL/x86Release/IAccessibleDLL.dll
ERROR:  Error loading gemspec. Aborting.
rake aborted!

I only see x64Release directory under ext/IAccessibleDLL directory.

I saw this error when I didn't have msbuild in my PATH yet (added the entry C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\bin) and it was able to build. Regardless, I am working on some logic that checks if msbuild command will work.

bensandland commented 2 years ago

I can now checkout the repo and build / install without any issues.

I fixed some issues I ran into along the way, such as msbuild failing for WindowsForms due to nuget packages not being installed correctly. The code also tried to build a dll for "RAutomation.UIA" this ext file is now skipped since its dll is built when compiling UiaDll.sln

Lastly I improved the handling of architecture when moving the dlls from 'x86Release' or 'x64Release' folder into the 'Release' folder. This means rake build:all will create a rautomation-x86.gem and rautomation-x64.gem with the corresponding dlls bundled with it.

Let me know if you see any changes in the issues you are experiencing.

jarmo commented 2 years ago

I don't see any problem improvement. rake build still fails:

...
Moving x86 dll's into 'Release' folder..
Invalid gemspec in [rautomation.gemspec]: No such file or directory @ rb_sysopen - ext/IAccessibleDLL/x86Release/IAccessibleDLL.dll
ERROR:  Error loading gemspec. Aborting.
rake aborted!
Command failed with status (1): [gem build rautomation --platform x86-mingw...]

Same problem when trying to build on a 32 or 64 bit Ruby.

Does it build for you when you remove everything, which is not in git:

git clean -dxf
rake build
bensandland commented 2 years ago

I don't see any problem improvement. rake build still fails:

...
Moving x86 dll's into 'Release' folder..
Invalid gemspec in [rautomation.gemspec]: No such file or directory @ rb_sysopen - ext/IAccessibleDLL/x86Release/IAccessibleDLL.dll
ERROR:  Error loading gemspec. Aborting.
rake aborted!
Command failed with status (1): [gem build rautomation --platform x86-mingw...]

Same problem when trying to build on a 32 or 64 bit Ruby.

Does it build for you when you remove everything, which is not in git:

git clean -dxf
rake build

It doesn't, but I'm not seeing the same error as you.. I am getting a "RAutomation\ext\WindowsForms.nuget\nuget.targets(92,9): error : Unable to find versio n '1.0.5.0' of package 'UIA.Extensions'." which is strange because the program compile without issues when doing it through Visual Studio.

bensandland commented 2 years ago

I don't see any problem improvement. rake build still fails:

...
Moving x86 dll's into 'Release' folder..
Invalid gemspec in [rautomation.gemspec]: No such file or directory @ rb_sysopen - ext/IAccessibleDLL/x86Release/IAccessibleDLL.dll
ERROR:  Error loading gemspec. Aborting.
rake aborted!
Command failed with status (1): [gem build rautomation --platform x86-mingw...]

Same problem when trying to build on a 32 or 64 bit Ruby. Does it build for you when you remove everything, which is not in git:

git clean -dxf
rake build

It doesn't, but I'm not seeing the same error as you.. I am getting a "RAutomation\ext\WindowsForms.nuget\nuget.targets(92,9): error : Unable to find versio n '1.0.5.0' of package 'UIA.Extensions'." which is strange because the program compile without issues when doing it through Visual Studio.

OK I got it to work by updating NuGet.exe and modyifying the nuget.targets file.
I'm now seeing the same error as you, and it seems like the issue is that the 'x86Release' folder is never created in the IAcessibleDLL project, the files are placed in 'Release' instead..

Working on fixing this

bensandland commented 2 years ago

I can now do the following

git clean -dxf
rake build

Which will result in a x86-mingw32.gem and a x64-mingw32.gem file.

Here is a summary of my changes:

jarmo commented 2 years ago

Okay, rake build works now with 32 and 64bit Rubies. However, I'm failing to run specs with either of those.

1) With 32bit Ruby it doesn't run a single spec. This is what I get:

An error occurred while loading ./spec/adapter/ms_uia/control_spec.rb. - Did you mean?
                    rspec ./spec/adapter/ms_uia/value_control_spec.rb
                    rspec ./spec/adapter/ms_uia/tab_control_spec.rb
                    rspec ./spec/adapter/ms_uia/table_spec.rb

Failure/Error: ffi_lib 'user32', 'kernel32', 'ole32', File.dirname(__FILE__) + '/../../../../ext/IAccessibleDLL/Release/iaccessibleDll.dll'

LoadError:
  Could not open library 'C:/Users/jarm0/Documents/Projects/Ruby/RAutomation/lib/rautomation/adapter/ms_uia/../../../../ext/IAccessibleDLL/Release/iaccessibleDll.dll': H%H♀?♦
# ./lib/rautomation/adapter/ms_uia/functions.rb:11:in `<module:Functions>'
# ./lib/rautomation/adapter/ms_uia/functions.rb:8:in `<module:MsUia>'
# ./lib/rautomation/adapter/ms_uia/functions.rb:6:in `<module:Adapter>'
# ./lib/rautomation/adapter/ms_uia/functions.rb:5:in `<module:RAutomation>'
# ./lib/rautomation/adapter/ms_uia/functions.rb:4:in `<top (required)>'
# ./lib/rautomation/adapter/ms_uia.rb:10:in `<top (required)>'
# ./spec/adapter/ms_uia/control_spec.rb:45:in `block in <top (required)>'
# ./spec/adapter/ms_uia/control_spec.rb:3:in `<top (required)>'

An error occurred while loading ./spec/adapter/ms_uia/spinner_spec.rb.
Failure/Error:
  describe MsUia::Spinner, if: SpecHelper.adapter == :ms_uia  do
    let(:main_window) { RAutomation::Window.new(title: 'MainFormWindow') }
    let(:data_entry) { main_window.button(value: 'Data Entry Form').click { window.exist? } }
    let(:window) { RAutomation::Window.new(title: 'DataEntryForm') }

    subject { window.spinner(id: 'numericUpDown1') }

    before(:each) do
      data_entry
    end

NameError:
  uninitialized constant RAutomation::Adapter::MsUia::Spinner
# ./spec/adapter/ms_uia/spinner_spec.rb:5:in `<top (required)>'

An error occurred while loading ./spec/adapter/ms_uia/tab_control_spec.rb.
Failure/Error:
  describe MsUia::TabControl, if: SpecHelper.adapter == :ms_uia do
    let(:window) { RAutomation::Window.new(title: 'MainFormWindow') }
    let(:about) { RAutomation::Window.new(title: 'About') }
    subject { about.tab_control(id: 'tabControl') }

    before(:each) do
      window.button(value: 'About').click { true }
    end

    it { should exist }

NameError:
  uninitialized constant RAutomation::Adapter::MsUia::TabControl
# ./spec/adapter/ms_uia/tab_control_spec.rb:5:in `<top (required)>'

Finished in 0.00003 seconds (files took 0.49274 seconds to load)
0 examples, 0 failures, 3 errors occurred outside of examples

2) With 64bit Ruby it does run some specs, but always ends with a segfault. This is what I get:

... everything passes up to this point

Win32::Mouse
  #click (FAILED - 1)
  #position
  #press/#release (FAILED - 2)

... some more passing and then always at the same time

Win32::Table
  #table
C:/RAutomation/lib/rautomation/adapter/win_32/functions.rb:255: [BUG] Segmentation fault
ruby 2.6.5p114 (2019-10-01 revision 67812) [x64-mingw32]

-- Control frame information -----------------------------------------------
c:0030 p:---- s:0157 e:000156 CFUNC  :_get_table_row_state_x86
c:0029 p:0034 s:0150 e:000149 METHOD C:/RAutomation/lib/rautomation/adapter/win_32/functions.rb:255
c:0028 p:0049 s:0143 e:000142 METHOD C:/RAutomation/lib/rautomation/adapter/win_32/table.rb:19
c:0027 p:0028 s:0135 e:000133 BLOCK  C:/RAutomation/spec/adapter/win_32/table_spec.rb:21 [FINISH]
c:0026 p:---- s:0130 e:000129 CFUNC  :instance_exec
c:0025 p:0030 s:0125 e:000124 BLOCK  C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:263
c:0024 p:0003 s:0120 e:000119 BLOCK  C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:511
c:0023 p:0003 s:0117 e:000116 BLOCK  C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:468
c:0022 p:0003 s:0114 e:000113 BLOCK  C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/hooks.rb:486
c:0021 p:0027 s:0111 e:000110 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/hooks.rb:624
c:0020 p:0116 s:0104 e:000103 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/hooks.rb:486
c:0019 p:0026 s:0097 e:000096 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:468
c:0018 p:0024 s:0092 e:000091 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:511
c:0017 p:0116 s:0087 e:000086 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:259
c:0016 p:0049 s:0080 e:000079 BLOCK  C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example_group.rb:646 [FINISH]
c:0015 p:---- s:0074 e:000073 CFUNC  :map
c:0014 p:0015 s:0070 e:000069 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example_group.rb:642
c:0013 p:0080 s:0065 e:000064 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example_group.rb:607
c:0012 p:0009 s:0056 e:000055 BLOCK  C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:121 [FINISH]
c:0011 p:---- s:0052 e:000051 CFUNC  :map
c:0010 p:0034 s:0048 e:000047 BLOCK  C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:121
c:0009 p:0034 s:0045 e:000044 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/configuration.rb:2068
c:0008 p:0008 s:0041 e:000040 BLOCK  C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:116
c:0007 p:0010 s:0037 e:000036 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/reporter.rb:74
c:0006 p:0022 s:0032 e:000031 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:115
c:0005 p:0048 s:0025 e:000024 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:89
c:0004 p:0072 s:0019 e:000018 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:71
c:0003 p:0020 s:0011 e:000010 METHOD C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:45
c:0002 p:0021 s:0006 e:000005 EVAL   C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/exe/rspec:4 [FINISH]
c:0001 p:0000 s:0003 E:0017a0 (none) [FINISH]

-- Ruby level backtrace information ----------------------------------------
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/exe/rspec:4:in `<main>'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:45:in `invoke'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:71:in `run'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:89:in `run'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:115:in `run_specs'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/reporter.rb:74:in `report'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:116:in `block in run_specs'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/configuration.rb:2068:in `with_suite_hooks'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:121:in `block (2 levels) in run_specs'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:121:in `map'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb:121:in `block (3 levels) in run_specs'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example_group.rb:607:in `run'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example_group.rb:642:in `run_examples'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example_group.rb:642:in `map'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example_group.rb:646:in `block in run_examples'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:259:in `run'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:511:in `with_around_and_singleton_context_hooks'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:468:in `with_around_example_hooks'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/hooks.rb:486:in `run'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/hooks.rb:624:in `run_around_example_hooks_for'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/hooks.rb:486:in `block in run'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:468:in `block in with_around_example_hooks'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:511:in `block in with_around_and_singleton_context_hooks'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:263:in `block in run'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb:263:in `instance_exec'
C:/RAutomation/spec/adapter/win_32/table_spec.rb:21:in `block (2 levels) in <top (required)>'
C:/RAutomation/lib/rautomation/adapter/win_32/table.rb:19:in `selected?'
C:/RAutomation/lib/rautomation/adapter/win_32/functions.rb:255:in `get_table_row_state'
C:/RAutomation/lib/rautomation/adapter/win_32/functions.rb:255:in `_get_table_row_state_x86'

-- C level backtrace information -------------------------------------------
C:\WINDOWS\SYSTEM32\ntdll.dll(NtWaitForSingleObject+0x14) [0x00007ffedb8cd144]
C:\WINDOWS\System32\KERNELBASE.dll(WaitForSingleObjectEx+0x8e) [0x00007ffed91e306e]
C:\Ruby26-x64\bin\x64-msvcrt-ruby260.dll(rb_vm_bugreport+0x2eb) [0x000000006a680c4b]
C:\Ruby26-x64\bin\x64-msvcrt-ruby260.dll(rb_bug_context+0x70) [0x000000006a4ce9f0]
C:\Ruby26-x64\bin\x64-msvcrt-ruby260.dll(rb_check_safe_obj+0x4d0) [0x000000006a5e4460]
 [0x0000000000402426]
C:\WINDOWS\System32\msvcrt.dll(_C_specific_handler+0x98) [0x00007ffedaab7ff8]
C:\WINDOWS\SYSTEM32\ntdll.dll(_chkstk+0x11f) [0x00007ffedb8d241f]
C:\WINDOWS\SYSTEM32\ntdll.dll(RtlRaiseException+0x434) [0x00007ffedb8814a4]

-- Other runtime information -----------------------------------------------

* Loaded script: C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/exe/rspec

* Loaded features:

    0 enumerator.so
    1 thread.rb
    2 rational.so
    3 complex.so
    4 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/enc/encdb.so
    5 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/enc/trans/transdb.so
    6 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/enc/windows_1252.so
    7 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/rbconfig.rb
    8 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/compatibility.rb
    9 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/defaults.rb
   10 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/deprecate.rb
   11 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/errors.rb
   12 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/unknown_command_spell_checker.rb
   13 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/exceptions.rb
   14 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/basic_specification.rb
   15 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/stub_specification.rb
   16 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/platform.rb
   17 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/util/list.rb
   18 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/version.rb
   19 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/requirement.rb
   20 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/specification.rb
   21 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/ruby_installer/runtime/singleton.rb
   22 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/ruby_installer/runtime.rb
   23 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/ruby_installer/runtime/msys2_installation.rb
   24 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/fiddle.so
   25 C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/function.rb
   26 C:/Ruby26-x64/lib/ruby/2.6.0/fiddle/closure.rb
   27 C:/Ruby26-x64/lib/ruby/2.6.0/fiddle.rb
   28 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/ruby_installer/runtime/dll_directory.rb
   29 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/enc/utf_16le.so
   30 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/enc/trans/utf_16_32.so
   31 C:/Ruby26-x64/lib/ruby/2.6.0/rubygems/defaults/operating_system.rb
   32 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/util.rb
   33 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/dependency.rb
   34 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_gem.rb
   35 C:/Ruby26-x64/lib/ruby/2.6.0/monitor.rb
   36 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb
   37 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_warn.rb
   38 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems.rb
   39 C:/Ruby26-x64/lib/ruby/site_ruby/2.6.0/rubygems/path_support.rb
   40 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/version.rb
   41 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/core_ext/name_error.rb
   42 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/levenshtein.rb
   43 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/jaro_winkler.rb
   44 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/spell_checker.rb
   45 C:/Ruby26-x64/lib/ruby/2.6.0/delegate.rb
   46 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rb
   47 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb
   48 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/spell_checkers/name_error_checkers.rb
   49 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/spell_checkers/method_name_checker.rb
   50 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/spell_checkers/key_error_checker.rb
   51 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/spell_checkers/null_checker.rb
   52 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean/formatters/plain_formatter.rb
   53 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/did_you_mean-1.3.0/lib/did_you_mean.rb
   54 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/version.rb
   55 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/comparable_version.rb
   56 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/ruby_features.rb
   57 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support.rb
   58 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/caller_filter.rb
   59 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/version.rb
   60 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/warnings.rb
   61 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/warnings.rb
   62 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/set.rb
   63 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/flat_map.rb
   64 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/filter_manager.rb
   65 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/dsl.rb
   66 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/console_codes.rb
   67 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/snippet_extractor.rb
   68 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/syntax_highlighter.rb
   69 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/encoded_string.rb
   70 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/exception_presenter.rb
   71 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/shell_escape.rb
   72 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/helpers.rb
   73 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/notifications.rb
   74 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/reporter.rb
   75 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/hooks.rb
   76 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/reentrant_mutex.rb
   77 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/memoized_helpers.rb
   78 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/metadata.rb
   79 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/metadata_filter.rb
   80 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/pending.rb
   81 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/directory_maker.rb
   82 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters.rb
   83 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/ordering.rb
   84 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/world.rb
   85 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/backtrace_formatter.rb
   86 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/ruby_project.rb
   87 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/deprecation_formatter.rb
   88 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/output_wrapper.rb
   89 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/configuration.rb
   90 C:/Ruby26-x64/lib/ruby/2.6.0/optparse.rb
   91 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/option_parser.rb
   92 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/cgi/escape.so
   93 C:/Ruby26-x64/lib/ruby/2.6.0/cgi/util.rb
   94 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/strscan.so
   95 C:/Ruby26-x64/lib/ruby/2.6.0/erb.rb
   96 C:/Ruby26-x64/lib/ruby/2.6.0/shellwords.rb
   97 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/configuration_options.rb
   98 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/runner.rb
   99 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/invocations.rb
  100 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example.rb
  101 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/matcher_definition.rb
  102 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/method_signature_verifier.rb
  103 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/with_keywords_when_needed.rb
  104 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/shared_example_group.rb
  105 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/recursive_const_methods.rb
  106 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/example_group.rb
  107 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core.rb
  108 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/stringio.so
  109 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/base_formatter.rb
  110 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/base_text_formatter.rb
  111 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/formatters/documentation_formatter.rb
  112 C:/RAutomation/lib/rautomation/platform.rb
  113 C:/RAutomation/lib/rautomation/wait_helper.rb
  114 C:/Ruby26-x64/lib/ruby/2.6.0/fileutils/version.rb
  115 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/etc.so
  116 C:/Ruby26-x64/lib/ruby/2.6.0/fileutils.rb
  117 C:/RAutomation/lib/rautomation/adapter/helper.rb
  118 C:/RAutomation/lib/rautomation/button.rb
  119 C:/RAutomation/lib/rautomation/text_field.rb
  120 C:/RAutomation/lib/rautomation/element_collections.rb
  121 C:/RAutomation/lib/rautomation/window.rb
  122 C:/RAutomation/lib/rautomation.rb
  123 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-3.11.0/lib/rspec/version.rb
  124 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-3.11.0/lib/rspec.rb
  125 C:/Ruby26-x64/lib/ruby/2.6.0/timeout.rb
  126 C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/enc/trans/single_byte.so
  127 C:/RAutomation/spec/spec_helper.rb
  128 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/instance_method_stasher.rb
  129 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/method_double.rb
  130 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/argument_matchers.rb
  131 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/object_reference.rb
  132 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/example_methods.rb
  133 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/proxy.rb
  134 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/test_double.rb
  135 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/fuzzy_matcher.rb
  136 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/argument_list_matcher.rb
  137 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/mutex.rb
  138 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/message_expectation.rb
  139 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/order_group.rb
  140 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/object_formatter.rb
  141 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/error_generator.rb
  142 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/space.rb
  143 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/mutate_const.rb
  144 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/targets.rb
  145 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/syntax.rb
  146 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/configuration.rb
  147 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_message_expectation.rb
  148 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/method_reference.rb
  149 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_proxy.rb
  150 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/verifying_double.rb
  151 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks/version.rb
  152 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-mocks-3.11.1/lib/rspec/mocks.rb
  153 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/mocking_adapters/rspec.rb
  154 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/english_phrasing.rb
  155 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/composable.rb
  156 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/base_matcher.rb
  157 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in.rb
  158 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/generated_descriptions.rb
  159 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/dsl.rb
  160 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/matcher_delegator.rb
  161 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/aliased_matcher.rb
  162 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/expecteds_for_multiple_diffs.rb
  163 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers.rb
  164 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/expectation_target.rb
  165 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/syntax.rb
  166 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/configuration.rb
  167 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/fail_with.rb
  168 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/handler.rb
  169 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations/version.rb
  170 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/expectations.rb
  171 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/2.6/ffi_c.so
  172 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/platform.rb
  173 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/data_converter.rb
  174 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/types.rb
  175 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/library.rb
  176 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/errno.rb
  177 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/abstract_memory.rb
  178 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/pointer.rb
  179 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/memorypointer.rb
  180 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/struct_layout.rb
  181 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/struct_layout_builder.rb
  182 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/struct_by_reference.rb
  183 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/struct.rb
  184 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/union.rb
  185 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/managedstruct.rb
  186 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/callback.rb
  187 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/io.rb
  188 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/autopointer.rb
  189 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/variadic.rb
  190 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/enum.rb
  191 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/version.rb
  192 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi/ffi.rb
  193 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/ffi-1.15.5-x64-mingw32/lib/ffi.rb
  194 C:/RAutomation/lib/rautomation/adapter/ms_uia/constants.rb
  195 C:/RAutomation/lib/rautomation/adapter/ms_uia/keys.rb
  196 C:/RAutomation/lib/rautomation/adapter/ms_uia/keystroke_converter.rb
  197 C:/RAutomation/lib/rautomation/adapter/ms_uia/functions.rb
  198 C:/RAutomation/lib/rautomation/adapter/ms_uia/locators.rb
  199 C:/RAutomation/lib/rautomation/adapter/ms_uia/window.rb
  200 C:/RAutomation/lib/rautomation/adapter/ms_uia/button_helper.rb
  201 C:/RAutomation/lib/rautomation/adapter/ms_uia/control.rb
  202 C:/RAutomation/lib/rautomation/adapter/ms_uia/value_control.rb
  203 C:/RAutomation/lib/rautomation/adapter/ms_uia/button.rb
  204 C:/RAutomation/lib/rautomation/adapter/ms_uia/checkbox.rb
  205 C:/RAutomation/lib/rautomation/adapter/ms_uia/menu.rb
  206 C:/RAutomation/lib/rautomation/adapter/ms_uia/radio.rb
  207 C:/RAutomation/lib/rautomation/adapter/ms_uia/text_field.rb
  208 C:/RAutomation/lib/rautomation/adapter/ms_uia/select_list.rb
  209 C:/RAutomation/lib/rautomation/adapter/ms_uia/spinner.rb
  210 C:/RAutomation/lib/rautomation/adapter/ms_uia/table.rb
  211 C:/RAutomation/lib/rautomation/adapter/ms_uia/tab_control.rb
  212 C:/RAutomation/lib/rautomation/adapter/ms_uia/label.rb
  213 C:/RAutomation/lib/rautomation/adapter/ms_uia/list_box.rb
  214 C:/RAutomation/lib/rautomation/adapter/ms_uia/list_item.rb
  215 C:/RAutomation/lib/rautomation/adapter/ms_uia.rb
  216 C:/RAutomation/lib/rautomation/adapter/ms_uia/uia_dll.rb
  217 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib/rspec/core/profiler.rb
  218 C:/RAutomation/lib/rautomation/adapter/win_32/constants.rb
  219 C:/RAutomation/lib/rautomation/adapter/win_32/keys.rb
  220 C:/RAutomation/lib/rautomation/adapter/win_32/functions.rb
  221 C:/RAutomation/lib/rautomation/adapter/win_32/locators.rb
  222 C:/RAutomation/lib/rautomation/adapter/win_32/window.rb
  223 C:/RAutomation/lib/rautomation/adapter/win_32/button_helper.rb
  224 C:/RAutomation/lib/rautomation/adapter/win_32/control.rb
  225 C:/RAutomation/lib/rautomation/adapter/win_32/button.rb
  226 C:/RAutomation/lib/rautomation/adapter/win_32/checkbox.rb
  227 C:/RAutomation/lib/rautomation/adapter/win_32/radio.rb
  228 C:/RAutomation/lib/rautomation/adapter/win_32/text_field.rb
  229 C:/RAutomation/lib/rautomation/adapter/win_32/select_list.rb
  230 C:/RAutomation/lib/rautomation/adapter/win_32/table.rb
  231 C:/RAutomation/lib/rautomation/adapter/win_32/label.rb
  232 C:/RAutomation/lib/rautomation/adapter/win_32/list_box.rb
  233 C:/RAutomation/lib/rautomation/adapter/win_32/mouse.rb
  234 C:/RAutomation/lib/rautomation/adapter/win_32/password_field.rb
  235 C:/RAutomation/lib/rautomation/adapter/win_32.rb
  236 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/equal.rb
  237 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/raise_error.rb
  238 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/exist.rb
  239 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/be.rb
  240 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-expectations-3.11.0/lib/rspec/matchers/built_in/eq.rb
  241 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/diff-lcs-1.5.0/lib/diff/lcs/change.rb
  242 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/diff-lcs-1.5.0/lib/diff/lcs/callbacks.rb
  243 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/diff-lcs-1.5.0/lib/diff/lcs/internals.rb
  244 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/diff-lcs-1.5.0/lib/diff/lcs/backports.rb
  245 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/diff-lcs-1.5.0/lib/diff/lcs.rb
  246 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/diff-lcs-1.5.0/lib/diff/lcs/block.rb
  247 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/diff-lcs-1.5.0/lib/diff/lcs/hunk.rb
  248 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/hunk_generator.rb
  249 C:/Ruby26-x64/lib/ruby/2.6.0/prettyprint.rb
  250 C:/Ruby26-x64/lib/ruby/2.6.0/pp.rb
  251 C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib/rspec/support/differ.rb

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: https://www.ruby-lang.org/bugreport.html

C:/Ruby26-x64/bin/ruby.exe -I'C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-support-3.11.0/lib';'C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/lib' 'C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/rspec-core-3.11.0/exe/rspec' --pattern 'spec/**{,/*/**}/*_spec.rb' failed

3) Why are gems being built when running specs? Let's build gems only when rake release is called, since they are not necessary to be built before that.

4) bundle commands doesn't work with neither Rubies under RAutomation directory. For example bundle exec or bundle install:

Moving x86 dll's into 'Release' folder..
Could not find gem 'rautomation x64-mingw32' in source at `.`.

The source contains the following gems matching 'rautomation':
  * rautomation-1.1.0-x86-mingw32

Same question also as was in 3 - why is there anything related gems up to this point.

5) Add everything into .gitignore which should not be committed. As of now:

ext/IAccessibleDLL/x64Release/
ext/IAccessibleDLL/x86Release/
ext/UiaDll/x64Release/
ext/UiaDll/x86Release/
rautomation-1.1.0-x64-mingw32.gem
rautomation-1.1.0-x86-mingw32.gem
bensandland commented 2 years ago

Okay, rake build works now with 32 and 64bit Rubies. However, I'm failing to run specs with either of those.

This has now been fixed. I didn't try to run the specs after installing, and there was some WindowsForms files missing.

  1. Why are gems being built when running specs? Let's build gems only when rake release is called, since they are not necessary to be built before that.

This was very strange and of course not intended to build anything before running specs. The Rakefile has been modified and the tasks works again.

  1. bundle commands doesn't work with neither Rubies under RAutomation directory. For example bundle exec or bundle install:
Moving x86 dll's into 'Release' folder..
Could not find gem 'rautomation x64-mingw32' in source at `.`.

The source contains the following gems matching 'rautomation':
  * rautomation-1.1.0-x86-mingw32

Same question also as was in 3 - why is there anything related gems up to this point.

Most likely due to a bundler version mismatch. I fixed this by deleting my Gemfile.lock file and then running bundle install again.

  1. Add everything into .gitignore which should not be committed. As of now:
ext/IAccessibleDLL/x64Release/
ext/IAccessibleDLL/x86Release/
ext/UiaDll/x64Release/
ext/UiaDll/x86Release/
rautomation-1.1.0-x64-mingw32.gem
rautomation-1.1.0-x86-mingw32.gem

Done.

I have built, installed and then executed all specs on both platforms. Tests passed as expected:

full_spec_x64

full_spec_x86

The specs failing are the ones I've mentioned before; the first one is failing due to my keyboard layout (if I switch to EN-US it passes no problem) and the windows.size returning 1 instead of 2

The installed Ruby versions are 2.5.1 32bit and 2.7 64bit.

Let me know if there's anything else I can help with.

jarmo commented 1 year ago

Getting closer. This is how I ran specs for 32 and 64bit rubies:

git clean -dxf
rake build
rake spec

1) Got a warning about deprecated RSpec syntax usage and also had a windows_spec failing with 2 windows instead of 1, but reason for me was that there was a Notepad++ application open as well at the same time. Please add the following changes and see what titles you see for your windows when it finds more than 1:

diff --git a/spec/adapter/ms_uia/table_spec.rb b/spec/adapter/ms_uia/table_spec.rb
index 787d1a7..da2304e 100644
--- a/spec/adapter/ms_uia/table_spec.rb
+++ b/spec/adapter/ms_uia/table_spec.rb
@@ -48,7 +48,7 @@ describe 'MsUia::Table', if: SpecHelper.adapter == :ms_uia do
     large_grid.select(value: /^FirstName[1-9]$/)
     first_nine = large_grid.rows.take(9)
     expect(first_nine.count).to eq(9)
-    first_nine.should be_all(&:selected?)
+    expect(first_nine.all?(&:selected?)).to be true
   end

   it '#clear' do
diff --git a/spec/windows_spec.rb b/spec/windows_spec.rb
index 53f17d0..6e79408 100644
--- a/spec/windows_spec.rb
+++ b/spec/windows_spec.rb
@@ -45,7 +45,7 @@ describe RAutomation::Windows do
                                  .windows(title: SpecHelper::DATA[:window2_title])
     expect(windows).to be_a(RAutomation::Windows)

-    expect(windows.size).to eq(2) # this always returns 1?
+    expect(windows.size).to eq(1), "expected to have 1 window, but got #{windows.size} with the following titles:#{$/}#{windows.map(&:title).join($/)}"
     expected_windows = [
       RAutomation::Window.new(pid: @pid2),
     ]

2) Now, there are still some problems - since 64bit Ruby will be only supported right now for win_32 adapter then there should be thrown an exception with a clear message when anyone is on a 64bit Ruby and tries to use ms_uia adapter. Maybe something like:

RAutomation :ms_uia adapter is only supported on a 32bit Ruby - please use either :win32 adapter or 32bit Ruby.

3) Same thing is when running specs (especially now that spec:all is the default) - when running specs on a 64bit Ruby then ms_uia specs should be skipped with showing a clear message as to why they were skipped. I guess the easiest way to do that would be to change SpecHelper.adapter so that it will return :unsupported_platform when :ms_uia will be detected on a 64bit Ruby and log out the message explained above. Something like this:

module SpecHelper
  def adapter
    adapter = ENV["RAUTOMATION_ADAPTER"] && ENV["RAUTOMATION_ADAPTER"].to_sym || RAutomation::Adapter::Helper.default_adapter
    if adapter != :win32 && running_64_bit_ruby?
      :unsupported_platform
    else
      adapter
    end
  end

4) gem(s) were built before into pkg directory, but now they're cluttering root. Please build them again into pkg and remove added .gitignore entry

bensandland commented 1 year ago
  1. Updated specs with you suggested changes. The windows_spec error was caused by Notepad++ being open. Kept the more descriptive error message in the expect call for clarity.

  2. Added a check for this inside window.rb - was unsure where to implement this logic, let me know if you think there's a better location.

  3. I added this logic but not sure where to put the error message. Looks like SpecHelper.adapter is primarily called when using a 'describe' block in the respective spec file. Do you have a suggestion on a clean implementation?

  4. Removed *.gem entry from .gitignore. Although there currently is nowhere that the pkg/ directory is specified - to my knowledge the gems are located in here when running the task through Bundler.

bensandland commented 1 year ago

@jarmo any news? would love to get this merged soon

jarmo commented 1 year ago

Running specs on a 32 bit Ruby ended up running all specs for win32 adapter, then all specs for ms_uia adapter and then again all specs for ms_uia adapter. For some reason specs were run twice for ms_uia. I don't think it was like that before. But all specs passed, which is good.

Running specs on a 64 bit Ruby however fail all like this:

Failure/Error: @pid1 = IO.popen(SpecHelper::DATA[:window1]).pid

      NoMethodError:
        undefined method `[]' for nil:NilClass
      # ./spec/spec_helper.rb:120:in `block (2 levels) in <top (required)>'

I'm running specs with the following command:

git clean -dxf
rake build
rake spec

I'm pretty sure that it is related with the :unsupported_adapter in SpecHelper. Did you not run specs on 64 bit Ruby after this change? My proposed solution was just a proof of concept not a real solution, which might not even work.

jarmo commented 1 year ago
2. Added a check for this inside window.rb - was unsure where to implement this logic, let me know if you think there's a better location.

Seems to be a good place since this is the place where adapter is being chosen.

4. Removed  *.gem entry from .gitignore. Although there currently is nowhere that the pkg/ directory is specified - to my knowledge the gems are located in here when running the task through Bundler.

They were definitely built into pkg directory before in master.

bensandland commented 1 year ago

Running specs on a 32 bit Ruby ended up running all specs for win32 adapter, then all specs for ms_uia adapter and then again all specs for ms_uia adapter. For some reason specs were run twice for ms_uia. I don't think it was like that before. But all specs passed, which is good.

This is very strange. When running specs on 32/64 bit I'm only executing win_32 specs.

When using 'gem build' the move_adapter_dlls function will move the dll's inside 'x86Release' into 'Release' Before my most recent changes it would do this twice (when using rake build).

Due to this the dll's inside the 'Release' folder might not be the correct ones for your target architecture. For instance I can run the x64 specs from within the project after the 'rake build' command, but to run the x86 ones I would have to move the dll's from 'x86Release' into 'Release'

However I have now re-added the Bundler::GemHelper.install_tasks call to the Rakefile. This makes the Rake task output the gem to pkg/ directory, and the gem is also only built for the platform that the command is executed from. Eg. I run 'rake build' from my Ruby x86 installation, a rautomation-1.1.0-x86-mingw32.gem is built - and vice versa for x64.

Running specs on a 64 bit Ruby however fail all like this:

Failure/Error: @pid1 = IO.popen(SpecHelper::DATA[:window1]).pid

      NoMethodError:
        undefined method `[]' for nil:NilClass
      # ./spec/spec_helper.rb:120:in `block (2 levels) in <top (required)>'

I'm running specs with the following command:

git clean -dxf
rake build
rake spec

I'm pretty sure that it is related with the :unsupported_adapter in SpecHelper. Did you not run specs on 64 bit Ruby after this change? My proposed solution was just a proof of concept not a real solution, which might not even work.

Try this again maybe? I'm almost certain I ran specs on both platforms after pushing this change. Just now I have followed the steps specified above on both platforms, without any errors. Also the only specs executed on both installations was for the win_32 adapter. I am using Rake v 10.5.0 on both Ruby x86 and x64

jarmo commented 1 year ago

... and the gem is also only built for the platform that the command is executed from

Since I'm not familiar with Rubygems release process when it comes to releasing gem for different platforms then does it mean that I have to push two separate gems to Rubygems in the end? One for 32bit and another for 64 bit?

Ran specs against the latest changes. I don't see any changes - all specs pass on 32bit Ruby while running ms_uia specs twice. Maybe this has been like that before too, but I cannot test it anymore since master branch does not work for me anymore due to having been messing around with visual studio build tools (written about it long time ago in this thread).

And running specs with 64 bit Ruby fail with the same error:

NoMethodError:
        undefined method `[]' for nil:NilClass
      # ./spec/spec_helper.rb:120:in `block (2 levels) in <top (required)>'

If you look at the code, then how can they pass for you? You should definitely see the same error, when :unsupported_adapter is provided for spec_helper DATA Hash object. Do you have something not pushed to remote git repo?

bensandland commented 1 year ago

... and the gem is also only built for the platform that the command is executed from

Since I'm not familiar with Rubygems release process when it comes to releasing gem for different platforms then does it mean that I have to push two separate gems to Rubygems in the end? One for 32bit and another for 64 bit?

Ran specs against the latest changes. I don't see any changes - all specs pass on 32bit Ruby while running ms_uia specs twice. Maybe this has been like that before too, but I cannot test it anymore since master branch does not work for me anymore due to having been messing around with visual studio build tools (written about it long time ago in this thread).

And running specs with 64 bit Ruby fail with the same error:

NoMethodError:
        undefined method `[]' for nil:NilClass
      # ./spec/spec_helper.rb:120:in `block (2 levels) in <top (required)>'

If you look at the code, then how can they pass for you? You should definitely see the same error, when :unsupported_adapter is provided for spec_helper DATA Hash object. Do you have something not pushed to remote git repo?

OK. I had some more time to debug and finally figured out what was happening.

I mentioned earlier that one spec, 'Win32::Window#send arbitrary characters and control keys' was failing when I used a keyboard layout that wasn't US. When this test fails on the win_32 adapter, the task for the ms_uia adapter was never invoked, which means I would never encounter the ":unsupported_adapter" symbol being used.

I have now pushed a fix containing logic that will make sure the unsupported adapters are skipped, depending on runtime platform.

These are the steps I'm following to test and build for both platforms:

rake build rake spec

Switch to remaining platform and run same commands. You can of course build/test independently.

However this assumes the VS projects are set up correctly. I will list the steps I did to make sure they both compiled correctly.

UiaDLL/IAccessibleDLL:

WindowsForms:

Once the projects are set up correctly the 'msbuild' calls works.

The specs will now only run for the win_32 adapter when using x64. Specs being ran twice has also been fixed.

Let me know if you have any issues or questions

jarmo commented 1 year ago

@bensandland thank you for being patient and having perseverance to actually go through with this PR! It's been quite a journey and I've released RAutomation version 2.0.1 with these changes.

As I understand then Rubygems (https://rubygems.org/gems/rautomation) shows that the latest version is 1.0.1 due to the fact that we now build and release platform specific gems. I guess 1.0.1 is the last version, which was installable on all platforms. I've tried to install rautomation on Linux and it installed 1.0.1, but on 64bit and 32bit Windows Rubies a correct version was installed. Not sure there is a way to "fix" this situation since actually this gem does not do anything useful at this moment on non-Windows platforms. The only way to "fix" it would be to yank all the all versions I guess, which I'm not going to do.

Anyway, thank you again for your contributions! If you'd like your name to be listed in the README under contributors then create another PR with your details and I'll merge it in.

Until next PR!