blob: 2f1ca1d2c2376395765d2504f9b7a07fa48ca38b [file] [log] [blame]
using System;
using NUnit.Framework;
namespace OpenQA.Selenium.Support.UI
{
[TestFixture]
public class LoadableComponentTests
{
[Test]
public void ShouldDoNothingIfComponentIsAlreadyLoaded()
{
try
{
new DetonatingComponent().Load();
}
catch (NotImplementedException)
{
Assert.Fail("Should not have called the load method");
}
}
[Test]
public void ShouldCauseTheLoadMethodToBeCalledIfTheComponentIsNotAlreadyLoaded()
{
LoadsOk ok = new LoadsOk(true);
ok.Load();
Assert.True(ok.WasLoadCalled());
}
[Test]
public void ShouldThrowAnErrorIfCallingLoadDoesNotCauseTheComponentToLoad()
{
LoadsOk ok = new LoadsOk(false);
try
{
ok.Load();
Assert.Fail();
}
catch (LoadableComponentException e)
{
Assert.AreEqual("Expected failure", e.Message);
}
}
[Test]
public void ShouldCallHandleLoadErrorWhenWebDriverExceptionOccursDuringExecuteLoad()
{
ExecuteLoadThrows loadThrows = new ExecuteLoadThrows();
try
{
loadThrows.Load();
Assert.Fail();
}
catch (Exception e)
{
Assert.AreEqual("HandleLoadError called", e.Message);
Assert.AreEqual("Excpected failure in ExecuteLoad", e.InnerException.Message);
}
}
private class DetonatingComponent : LoadableComponent<DetonatingComponent>
{
protected override void ExecuteLoad()
{
throw new NotImplementedException("I should never be called");
}
protected override bool EvaluateLoadedStatus()
{
return true;
}
}
private class LoadsOk : LoadableComponent<LoadsOk>
{
private readonly bool secondLoadCallPasses;
private bool callOfLoadMethodForced;
private bool loadCalled;
public LoadsOk(bool secondLoadCallPasses)
{
this.secondLoadCallPasses = secondLoadCallPasses;
}
protected override void ExecuteLoad()
{
loadCalled = true;
}
protected override bool EvaluateLoadedStatus()
{
if (!callOfLoadMethodForced)
{
callOfLoadMethodForced = true;
UnableToLoadMessage = "Should never be seen, ExecuteLoad() will be called and this will return true the second time unless testing for expected failure on the second pass.";
return false;
}
if (!secondLoadCallPasses)
{
UnableToLoadMessage = "Expected failure";
return false;
}
return true;
}
public bool WasLoadCalled()
{
return loadCalled;
}
}
private class ExecuteLoadThrows : LoadableComponent<ExecuteLoadThrows>
{
protected override void ExecuteLoad()
{
throw new WebDriverException("Excpected failure in ExecuteLoad");
}
protected override bool EvaluateLoadedStatus()
{
return false;
}
protected override void HandleLoadError(WebDriverException ex)
{
throw new Exception("HandleLoadError called", ex);
}
}
}
}