diff --git a/src/ToDoList.Automation/Questions/Converters/WebElementToToDoItemConverter.cs b/src/ToDoList.Automation/Questions/Converters/WebElementToToDoItemConverter.cs index f63d6820..92b0fcb0 100644 --- a/src/ToDoList.Automation/Questions/Converters/WebElementToToDoItemConverter.cs +++ b/src/ToDoList.Automation/Questions/Converters/WebElementToToDoItemConverter.cs @@ -24,7 +24,7 @@ public Model.ToDoItem Convert(IWebElement source, CultureInfo culture) { var target = Target.The("To do item").LocatedByWebElement(source); return new Model.ToDoItem( - _actor.AsksFor(TextContent.Of(ToDoPage.ToDoItemName.RelativeTo(target)).Value), + _actor.AsksFor(TextContent.Of(ToDoPage.ToDoItemName.RelativeTo(target))), target.ResolveFor(_webDriver).GetAttribute("class").Contains("completed") ); } diff --git a/src/Tranquire.Selenium.Tests/Actions/Actions.cs b/src/Tranquire.Selenium.Tests/Actions/Actions.cs index 405d1dc3..71ec693d 100644 --- a/src/Tranquire.Selenium.Tests/Actions/Actions.cs +++ b/src/Tranquire.Selenium.Tests/Actions/Actions.cs @@ -43,7 +43,7 @@ private void TestClick(string buttonId, Func> click) //act Fixture.Actor.When(click(clickTarget)); //assert - var actual = Answer(TextContent.Of(expectedClickContent).Value); + var actual = Answer(TextContent.Of(expectedClickContent)); Assert.Equal(expected, actual); } @@ -58,7 +58,7 @@ public void SelectByValueAction_ShouldSelectCorrectElement(string expected) var action = Select.TheValue(expected).Into(SelectElementTarget); //act Fixture.Actor.When(action); - var actual = Answer(SelectedValue.Of(SelectElementTarget).Value); + var actual = Answer(SelectedValue.Of(SelectElementTarget)); //assert Assert.Equal(expected, actual); } @@ -79,7 +79,7 @@ public void SelectByValuesAction_ShouldSelectCorrectElement( var action = Select.TheValues(expected).Into(SelectManyElementTarget); //act Fixture.Actor.When(action); - var actual = Answer(SelectedValues.Of(SelectManyElementTarget).Value); + var actual = Answer(SelectedValues.Of(SelectManyElementTarget)); //assert Assert.Equal(expected, actual); } @@ -95,7 +95,7 @@ public void SelectByIndexAction_ShouldSelectCorrectElement(int index, string exp var action = Select.TheIndex(index).Into(SelectElementTarget); //act Fixture.Actor.When(action); - var actual = Answer(SelectedValue.Of(SelectElementTarget).Value); + var actual = Answer(SelectedValue.Of(SelectElementTarget)); //assert Assert.Equal(expected, actual); } @@ -112,7 +112,7 @@ public void SelectByIndexesAction_ShouldSelectCorrectElement(int[] indexes, stri var action = Select.TheIndexes(indexes).Into(SelectManyElementTarget); //act Fixture.Actor.When(action); - var actual = Answer(SelectedValues.Of(SelectManyElementTarget).Value); + var actual = Answer(SelectedValues.Of(SelectManyElementTarget)); //assert Assert.Equal(expected, actual); } @@ -128,7 +128,7 @@ public void SelectByTextAction_ShouldSelectCorrectElement(string text, string ex var action = Select.TheText(text).Into(SelectElementTarget); //act Fixture.Actor.When(action); - var actual = Answer(SelectedValue.Of(SelectElementTarget).Value); + var actual = Answer(SelectedValue.Of(SelectElementTarget)); //assert Assert.Equal(expected, actual); } @@ -145,7 +145,7 @@ public void SelectByTextsAction_ShouldSelectCorrectElement(string[] texts, strin var action = Select.TheTexts(texts).Into(SelectManyElementTarget); //act Fixture.Actor.When(action); - var actual = Answer(SelectedValues.Of(SelectManyElementTarget).Value); + var actual = Answer(SelectedValues.Of(SelectManyElementTarget)); //assert Assert.Equal(expected, actual); } @@ -163,7 +163,7 @@ public void ClearValue_ShouldClearTheValue(string inputValue) //act Fixture.Actor.When(Clear.TheValueOf(target)); //assert - var actual = Answer(Value.Of(target).Value); + var actual = Answer(Value.Of(target)); Assert.Equal(string.Empty, actual); } @@ -178,7 +178,7 @@ public void ClearValue_WhenCursorIsNotAtTheEnd_ShouldClearTheValue() //act Fixture.Actor.When(Clear.TheValueOf(target)); //assert - var actual = Answer(Value.Of(target).Value); + var actual = Answer(Value.Of(target)); Assert.Equal(string.Empty, actual); } @@ -193,7 +193,7 @@ public void ClearValue_WhenCursorIsAtTheBeginning_ShouldClearTheValue() //act Fixture.Actor.When(Clear.TheValueOf(target)); //assert - var actual = Answer(Value.Of(target).Value); + var actual = Answer(Value.Of(target)); Assert.Equal(string.Empty, actual); } } diff --git a/src/Tranquire.Selenium.Tests/Actions/ClickWhenTargetIsNotClickableYet.cs b/src/Tranquire.Selenium.Tests/Actions/ClickWhenTargetIsNotClickableYet.cs index e769f6d0..18951d56 100644 --- a/src/Tranquire.Selenium.Tests/Actions/ClickWhenTargetIsNotClickableYet.cs +++ b/src/Tranquire.Selenium.Tests/Actions/ClickWhenTargetIsNotClickableYet.cs @@ -33,7 +33,7 @@ private void TestExecute(string expected, System.Action> //act execute(Click.On(target).AllowRetry()); //assert - var actual = Answer(Value.Of(Target.The("expected value").LocatedBy(By.Id("ExpectedValue"))).Value); + var actual = Answer(Value.Of(Target.The("expected value").LocatedBy(By.Id("ExpectedValue")))); Assert.Equal(expected, actual); } diff --git a/src/Tranquire.Selenium.Tests/Actions/EnterTests.cs b/src/Tranquire.Selenium.Tests/Actions/EnterTests.cs index 6a35b5ce..a7156182 100644 --- a/src/Tranquire.Selenium.Tests/Actions/EnterTests.cs +++ b/src/Tranquire.Selenium.Tests/Actions/EnterTests.cs @@ -20,7 +20,7 @@ public void EnterNewValue_ShouldReturnCorrectValue(string expected) var action = Enter.TheNewValue(expected).Into(target); //act Fixture.Actor.When(action); - var actual = Answer(Value.Of(target).Value); + var actual = Answer(Value.Of(target)); //assert Assert.Equal(expected, actual); } diff --git a/src/Tranquire.Selenium.Tests/Actions/OpenContextMenuTests.cs b/src/Tranquire.Selenium.Tests/Actions/OpenContextMenuTests.cs index dbe139e8..08fd184e 100644 --- a/src/Tranquire.Selenium.Tests/Actions/OpenContextMenuTests.cs +++ b/src/Tranquire.Selenium.Tests/Actions/OpenContextMenuTests.cs @@ -24,7 +24,7 @@ public void Execute_ShouldOpenContextMenu(string expected) //act Fixture.Actor.When(action); //assert - var actual = Answer(Value.Of(expectedClickContent).Value); + var actual = Answer(Value.Of(expectedClickContent)); Assert.Equal(expected, actual); } } diff --git a/src/Tranquire.Selenium.Tests/Actions/WaitTests.cs b/src/Tranquire.Selenium.Tests/Actions/WaitTests.cs index deceec57..10968c69 100644 --- a/src/Tranquire.Selenium.Tests/Actions/WaitTests.cs +++ b/src/Tranquire.Selenium.Tests/Actions/WaitTests.cs @@ -28,7 +28,7 @@ public void Execute_ShouldWait(string id) //act Fixture.Actor.When(Wait.UntilTargetIsPresent(target)); //assert - var actual = Answer(Presence.Of(target).Value); + var actual = Answer(Presence.Of(target)); Assert.True(actual); } @@ -59,7 +59,7 @@ public void UntilQuestionIsAnswered_ShouldWait(string expected) //arrange var target = Target.The("element to wait for").LocatedBy(By.Id("ChangeTextElement")); ChangeText(expected); - var question = TextContent.Of(target).Value; + var question = TextContent.Of(target); //act Fixture.Actor.When(Wait.UntilQuestionIsAnswered(question, t => t == expected)); //arrange @@ -73,7 +73,7 @@ public void UntilQuestionIsAnswered_WhenTimeout_ShouldThrow(string expected) //arrange var target = Target.The("element to wait for").LocatedBy(By.Id("ChangeTextElement")); ChangeText(expected); - var question = TextContent.Of(target).Value; + var question = TextContent.Of(target); //act Assert.Throws(() => Fixture.Actor.When(Wait.UntilQuestionIsAnswered(question, t => t == expected) diff --git a/src/Tranquire.Selenium.Tests/Questions/Questions.Attribute.cs b/src/Tranquire.Selenium.Tests/Questions/Questions.Attribute.cs index 5430983a..0b38b08a 100644 --- a/src/Tranquire.Selenium.Tests/Questions/Questions.Attribute.cs +++ b/src/Tranquire.Selenium.Tests/Questions/Questions.Attribute.cs @@ -13,7 +13,7 @@ public void ElementWithAttribute_ShouldReturnCorrectValue(string attribute, stri { //arrange var target = Target.The("element with attribute").LocatedBy(By.Id("ElementWithAttribute")); - var question = HtmlAttribute.Of(target).Named(attribute).Value; + var question = HtmlAttribute.Of(target).Named(attribute); //act var actual = Answer(question); //assert diff --git a/src/Tranquire.Selenium.Tests/Questions/Questions.Classes.cs b/src/Tranquire.Selenium.Tests/Questions/Questions.Classes.cs index 8e75f038..1b32013b 100644 --- a/src/Tranquire.Selenium.Tests/Questions/Questions.Classes.cs +++ b/src/Tranquire.Selenium.Tests/Questions/Questions.Classes.cs @@ -16,7 +16,7 @@ public void Classes_ShouldReturnCorrectValue(string id, string[] expected) { //arrange var target = Target.The("Element with classes").LocatedBy(By.Id(id)); - var question = Classes.Of(target).Value; + var question = Classes.Of(target); //act var actual = Answer(question); //assert diff --git a/src/Tranquire.Selenium.Tests/Questions/Questions.CssValue.cs b/src/Tranquire.Selenium.Tests/Questions/Questions.CssValue.cs index 99384be3..3a5bd377 100644 --- a/src/Tranquire.Selenium.Tests/Questions/Questions.CssValue.cs +++ b/src/Tranquire.Selenium.Tests/Questions/Questions.CssValue.cs @@ -15,7 +15,7 @@ public void CssValueElement_ShouldReturnCorrectValue(string id, string cssProper { //arrange var target = Target.The("css value element").LocatedBy(By.Id(id)); - var question = CssValue.Of(target).AndTheProperty(cssProperty).Value; + var question = CssValue.Of(target).AndTheProperty(cssProperty); //act var actual = Answer(question); //assert diff --git a/src/Tranquire.Selenium.Tests/Questions/Questions.Enabled.cs b/src/Tranquire.Selenium.Tests/Questions/Questions.Enabled.cs index 7bca0d4b..b5553fc9 100644 --- a/src/Tranquire.Selenium.Tests/Questions/Questions.Enabled.cs +++ b/src/Tranquire.Selenium.Tests/Questions/Questions.Enabled.cs @@ -14,7 +14,7 @@ public void EnabledElement_ShouldReturnCorrectValue(string id, bool expected) { //arrange var target = Target.The("enabled element").LocatedBy(By.Id(id)); - var question = Enabled.Of(target).Value; + var question = Enabled.Of(target); //act var actual = Answer(question); //assert diff --git a/src/Tranquire.Selenium.Tests/Questions/Questions.Presence.cs b/src/Tranquire.Selenium.Tests/Questions/Questions.Presence.cs index a9e999ce..85e1d639 100644 --- a/src/Tranquire.Selenium.Tests/Questions/Questions.Presence.cs +++ b/src/Tranquire.Selenium.Tests/Questions/Questions.Presence.cs @@ -13,7 +13,7 @@ public void Presence_ShouldReturnCorrectValue(string id, bool expected) { //arrange var target = Target.The("presence element").LocatedBy(By.Id(id)); - var question = Presence.Of(target).Value; + var question = Presence.Of(target); //act var actual = Answer(question); //assert diff --git a/src/Tranquire.Selenium.Tests/Questions/Questions.Selected.cs b/src/Tranquire.Selenium.Tests/Questions/Questions.Selected.cs index e2ac8666..4e22c603 100644 --- a/src/Tranquire.Selenium.Tests/Questions/Questions.Selected.cs +++ b/src/Tranquire.Selenium.Tests/Questions/Questions.Selected.cs @@ -14,7 +14,7 @@ public void SelectedElement_ShouldReturnCorrectValue(string id, bool expected) { //arrange var target = Target.The("selected element").LocatedBy(By.Id(id)); - var question = Selected.Of(target).Value; + var question = Selected.Of(target); //act var actual = Answer(question); //assert @@ -31,7 +31,7 @@ public void SelectedValueElement_ShouldReturnCorrectValue(string id, string expe { //arrange var target = Target.The("selected element").LocatedBy(By.Id(id)); - var question = SelectedValue.Of(target).Value; + var question = SelectedValue.Of(target); //act var actual = Answer(question); //assert @@ -43,7 +43,7 @@ public void SelectedValueElement_WhenTargetIsNotASelectElement_ShouldThrow() { //arrange var target = Target.The("selected element").LocatedBy(By.Id("NotASelectElement")); - var question = SelectedValue.Of(target).Value; + var question = SelectedValue.Of(target); //act Assert.Throws(() => Answer(question)); } @@ -59,7 +59,7 @@ public void SelectedValuesElement_ShouldReturnCorrectValue(string id, string[] e { //arrange var target = Target.The("selected element").LocatedBy(By.Id(id)); - var question = SelectedValues.Of(target).Value; + var question = SelectedValues.Of(target); //act var actual = Answer(question); //assert @@ -71,7 +71,7 @@ public void SelectedValuesElement_WhenTargetIsNotASelectElement_ShouldThrow() { //arrange var target = Target.The("selected element").LocatedBy(By.Id("NotASelectElement")); - var question = SelectedValues.Of(target).Value; + var question = SelectedValues.Of(target); //act Assert.Throws(() => Answer(question)); } diff --git a/src/Tranquire.Selenium.Tests/Questions/Questions.Value.cs b/src/Tranquire.Selenium.Tests/Questions/Questions.Value.cs index 09e0a3c2..d9e0ffc6 100644 --- a/src/Tranquire.Selenium.Tests/Questions/Questions.Value.cs +++ b/src/Tranquire.Selenium.Tests/Questions/Questions.Value.cs @@ -16,7 +16,7 @@ public void ValueElement_ShouldReturnCorrectValue(string id, string expected) { //arrange var target = Target.The("value element").LocatedBy(By.Id(id)); - var question = Value.Of(target).Value; + var question = Value.Of(target); //act var actual = Answer(question); //assert diff --git a/src/Tranquire.Selenium.Tests/Questions/Questions.Visible.cs b/src/Tranquire.Selenium.Tests/Questions/Questions.Visible.cs index 3c09b512..c5ec7fea 100644 --- a/src/Tranquire.Selenium.Tests/Questions/Questions.Visible.cs +++ b/src/Tranquire.Selenium.Tests/Questions/Questions.Visible.cs @@ -14,7 +14,7 @@ public void VisibleElement_ShouldReturnCorrectValue(string id, bool expected) { //arrange var target = Target.The("visible element").LocatedBy(By.Id(id)); - var question = Visibility.Of(target).Value; + var question = Visibility.Of(target); //act var actual = Answer(question); //assert diff --git a/src/Tranquire.Selenium/Questions/ManyUIState.cs b/src/Tranquire.Selenium/Questions/ManyUIState.cs index a156623a..e107f33b 100644 --- a/src/Tranquire.Selenium/Questions/ManyUIState.cs +++ b/src/Tranquire.Selenium/Questions/ManyUIState.cs @@ -11,9 +11,10 @@ namespace Tranquire.Selenium.Questions /// Represent the UI state for a list of elements in the page /// /// - public class ManyUIState : UIState + public class ManyUIState : UIState, IQuestion> { private readonly Func Resolve; + private readonly Lazy>> _question; /// /// Creates a new instance of @@ -25,13 +26,15 @@ public ManyUIState(ITarget target, Func resolve, CultureInfo cul : base(target, culture) { Resolve = resolve; + _question = new Lazy>>(() => CreateQuestion(new GenericConverter(t => t))); } - + /// /// Gets a question which returns the state /// - public IQuestion> Value => CreateQuestion(new GenericConverter(t => t)); - + [Obsolete("This property will be removed in the future. Cast this class as a IQuestion> in order to get a question")] + public IQuestion> Value => _question.Value; + /// /// Creates a question /// @@ -86,5 +89,9 @@ protected override ImmutableArray Answer(IActor actor, WebBrowser ab /// /// public override string ToString() => $"What are the state of the elements identified by {Target.ToString()} ?"; + + string INamed.Name => _question.Value.Name; + + ImmutableArray IQuestion>.AnsweredBy(IActor actor) => _question.Value.AnsweredBy(actor); } } \ No newline at end of file diff --git a/src/Tranquire.Selenium/Questions/SingleUIState.cs b/src/Tranquire.Selenium/Questions/SingleUIState.cs index 79b40c7e..f9fe2f81 100644 --- a/src/Tranquire.Selenium/Questions/SingleUIState.cs +++ b/src/Tranquire.Selenium/Questions/SingleUIState.cs @@ -10,8 +10,11 @@ namespace Tranquire.Selenium.Questions /// /// /// - public abstract class SingleUIState : UIState where TState : SingleUIState + public abstract class SingleUIState : UIState, IQuestion + where TState : SingleUIState { + private readonly Lazy> _question; + /// /// Creates a new instance of with a culture /// @@ -19,12 +22,14 @@ public abstract class SingleUIState : UIState where TState : Singl /// protected SingleUIState(ITarget target, CultureInfo culture) : base(target, culture) { + _question = new Lazy>(() => CreateQuestion(new GenericConverter(t => t))); } /// /// Gets a question returning the state /// - public IQuestion Value => CreateQuestion(new GenericConverter(t => t)); + [Obsolete("This property will be removed in the future. Cast this class as a IQuestion in order to get a question")] + public IQuestion Value => _question.Value; /// /// Creates a question @@ -94,5 +99,12 @@ protected override TConverted Answer(IActor actor, WebBrowser ability) /// /// public override string ToString() => $"What is the state of the element identified by {Target.ToString()} ?"; - } + + string INamed.Name => _question.Value.Name; + + T IQuestion.AnsweredBy(IActor actor) + { + return _question.Value.AnsweredBy(actor); + } + } } \ No newline at end of file diff --git a/src/Tranquire.Selenium/Questions/Question.cs b/src/Tranquire.Selenium/Questions/WebBrowserQuestion.cs similarity index 100% rename from src/Tranquire.Selenium/Questions/Question.cs rename to src/Tranquire.Selenium/Questions/WebBrowserQuestion.cs diff --git a/src/Tranquire.Tests/QuestionClassWrapperTests.cs b/src/Tranquire.Tests/QuestionClassWrapperTests.cs new file mode 100644 index 00000000..b30d71ed --- /dev/null +++ b/src/Tranquire.Tests/QuestionClassWrapperTests.cs @@ -0,0 +1,47 @@ +using AutoFixture.Idioms; +using AutoFixture.Xunit2; +using Moq; +using System; +using Tranquire; +using Xunit; + +namespace Tranquire.Tests +{ + public class QuestionClassWrapperTests + { + [Theory, DomainAutoData] + public void Sut_VerifyGuardClauses(GuardClauseAssertion assertion) + { + assertion.Verify(typeof(QuestionClassWrapper).GetConstructors()); + } + + [Theory, DomainAutoData] + public void Name_ShouldReturnCorrectValue( + string expected, + [Frozen]IQuestion innerQuestion, + QuestionClassWrapper sut) + { + // arrange + Mock.Get(innerQuestion).Setup(q => q.Name).Returns(expected); + // act + var actual = sut.Name; + // assert + Assert.Equal(expected, actual); + } + + [Theory, DomainAutoData] + public void AnsweredBy_ShouldReturnCorrectValue( + object expected, + [Frozen]IQuestion innerQuestion, + QuestionClassWrapper sut, + IActor actor) + { + // arrange + Mock.Get(innerQuestion).Setup(q => q.AnsweredBy(actor)).Returns(expected); + // act + var actual = sut.AnsweredBy(actor); + // assert + Assert.Equal(expected, actual); + } + } +} diff --git a/src/Tranquire/QuestionWrapper.cs b/src/Tranquire/QuestionWrapper.cs new file mode 100644 index 00000000..f7a374bd --- /dev/null +++ b/src/Tranquire/QuestionWrapper.cs @@ -0,0 +1,26 @@ +namespace Tranquire +{ + /// + /// A wrapper of a that represents it as a class + /// + /// The question's answer type + public sealed class QuestionClassWrapper : IQuestion + { + private readonly IQuestion _question; + + /// + /// Creates a new instance of + /// + /// + public QuestionClassWrapper(IQuestion question) + { + _question = question ?? throw new System.ArgumentNullException(nameof(question)); + } + + /// + public string Name => _question.Name; + + /// + public T AnsweredBy(IActor actor) => _question.AnsweredBy(actor); + } +}