Skip to content

Commit

Permalink
Changes to .NET ExecuteJavaScript extension method for converting result
Browse files Browse the repository at this point in the history
Now validates that the ExecuteJavaScript extension method will correctly
detect if the script result is convertable to the generic type.

Signed-off-by: Jim Evans <[email protected]>
  • Loading branch information
chrisblock authored and jimevans committed Mar 26, 2015
1 parent dfb5446 commit a591496
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 1 deletion.
2 changes: 1 addition & 1 deletion dotnet/src/support/Extensions/WebDriverExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ public static T ExecuteJavaScript<T>(this IWebDriver driver, string script, para
}

object result = executor.ExecuteScript(script, args);
if (!result.GetType().IsAssignableFrom(typeof(T)))
if (typeof (T).IsInstanceOfType(result) == false)
{
throw new WebDriverException("Script returned a value, but the result could not be cast to the desired type");
}
Expand Down
104 changes: 104 additions & 0 deletions dotnet/test/support/Extensions/ExecuteJavaScriptTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;

using NMock2;

using NUnit.Framework;

namespace OpenQA.Selenium.Support.Extensions
{
public interface IJavaScriptExecutingWebDriver : IWebDriver, IJavaScriptExecutor
{
}

public class SubClassOfReadOnlyCollectionOfObject : ReadOnlyCollection<object>
{
public SubClassOfReadOnlyCollectionOfObject(IList<object> list) : base(list)
{
}
}

[TestFixture]
public class ExecuteJavaScriptTest
{
private const string JavaScript = "Hello, World";
private static readonly object[] JavaScriptParameters = new object[0];

private Mockery mocks;
private IJavaScriptExecutingWebDriver driver;

[SetUp]
public void TestSetUp()
{
mocks = new Mockery();

driver = mocks.NewMock<IJavaScriptExecutingWebDriver>();
}

[Test]
public void ShouldConvertToIEnumerable()
{
var expected = new ReadOnlyCollection<object>(new List<object>());

Expect.Once.On(driver)
.Method("ExecuteScript")
.With(JavaScript, JavaScriptParameters)
.Will(Return.Value(expected));

Assert.That(() => driver.ExecuteJavaScript<IEnumerable>(JavaScript, JavaScriptParameters), Throws.Nothing);
}

[Test]
public void ShouldConvertToIEnumerableOfObject()
{
var expected = new ReadOnlyCollection<object>(new List<object>());

Expect.Once.On(driver)
.Method("ExecuteScript")
.With(JavaScript, JavaScriptParameters)
.Will(Return.Value(expected));

Assert.That(() => driver.ExecuteJavaScript<IEnumerable<object>>(JavaScript, JavaScriptParameters), Throws.Nothing);
}

[Test]
public void ShouldNotConvertToIEnumerableOfInteger()
{
var expected = new ReadOnlyCollection<object>(new List<object>());

Expect.Once.On(driver)
.Method("ExecuteScript")
.With(JavaScript, JavaScriptParameters)
.Will(Return.Value(expected));

Assert.That(() => driver.ExecuteJavaScript<IEnumerable<int>>(JavaScript, JavaScriptParameters), Throws.InstanceOf<WebDriverException>());
}

[Test]
public void ShouldConvertToReadOnlyCollectionOfObject()
{
var expected = new ReadOnlyCollection<object>(new List<object>());

Expect.Once.On(driver)
.Method("ExecuteScript")
.With(JavaScript, JavaScriptParameters)
.Will(Return.Value(expected));

Assert.That(() => driver.ExecuteJavaScript<ReadOnlyCollection<object>>(JavaScript, JavaScriptParameters), Throws.Nothing);
}

[Test]
public void ShouldNotConvertToSubClassOfReadOnlyCollectionOfObject()
{
var expected = new ReadOnlyCollection<object>(new List<object>());

Expect.Once.On(driver)
.Method("ExecuteScript")
.With(JavaScript, JavaScriptParameters)
.Will(Return.Value(expected));

Assert.That(() => driver.ExecuteJavaScript<SubClassOfReadOnlyCollectionOfObject>(JavaScript, JavaScriptParameters), Throws.InstanceOf<WebDriverException>());
}
}
}
1 change: 1 addition & 0 deletions dotnet/test/support/WebDriver.Support.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Events\EventFiringWebDriverTest.cs" />
<Compile Include="Extensions\ExecuteJavaScriptTest.cs" />
<Compile Include="PageObjects\ByChainedBrowserTests.cs" />
<Compile Include="PageObjects\ByChainedTests.cs" />
<Compile Include="PageObjects\FindsByAttributeTests.cs" />
Expand Down

0 comments on commit a591496

Please sign in to comment.