From 1e6739f108992e44e8ec647a0c06932fc974ffbe Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Fri, 5 Jul 2019 20:12:52 -0700 Subject: [PATCH] Add globalization tests Adds tests for current culture bind with text fields This already functions correctly without new features or modifications. --- .../ServerExecutionTests/GlobalizationTest.cs | 103 ++++++++++++++++++ .../BasicTestApp/GlobalizationBindCases.razor | 35 ++++++ .../test/testassets/BasicTestApp/Index.razor | 1 + 3 files changed, 139 insertions(+) create mode 100644 src/Components/test/E2ETest/ServerExecutionTests/GlobalizationTest.cs create mode 100644 src/Components/test/testassets/BasicTestApp/GlobalizationBindCases.razor diff --git a/src/Components/test/E2ETest/ServerExecutionTests/GlobalizationTest.cs b/src/Components/test/E2ETest/ServerExecutionTests/GlobalizationTest.cs new file mode 100644 index 0000000000..3e62e34857 --- /dev/null +++ b/src/Components/test/E2ETest/ServerExecutionTests/GlobalizationTest.cs @@ -0,0 +1,103 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using BasicTestApp; +using Microsoft.AspNetCore.Components.E2ETest.Infrastructure; +using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures; +using Microsoft.AspNetCore.E2ETesting; +using OpenQA.Selenium; +using OpenQA.Selenium.Interactions; +using OpenQA.Selenium.Support.UI; +using Xunit; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Components.E2ETest.ServerExecutionTests +{ + // For now this is limited to server-side execution because we don't have the ability to set the + // culture in client-side Blazor. + public class GlobalizationTest : BasicTestAppTestBase + { + public GlobalizationTest( + BrowserFixture browserFixture, + ToggleExecutionModeServerFixture serverFixture, + ITestOutputHelper output) + : base(browserFixture, serverFixture.WithServerExecution(), output) + { + } + + protected override void InitializeAsyncCore() + { + // On WebAssembly, page reloads are expensive so skip if possible + Navigate(ServerPathBase, _serverFixture.ExecutionMode == ExecutionMode.Client); + MountTestComponent(); + WaitUntilExists(By.Id("culture-selector")); + } + + [Theory] + [InlineData("en-US")] + [InlineData("fr-FR")] + public void CanSetCultureAndParseCultueSensitiveNumbersAndDates(string culture) + { + var cultureInfo = CultureInfo.GetCultureInfo(culture); + + var selector = new SelectElement(Browser.FindElement(By.Id("culture-selector"))); + selector.SelectByValue(culture); + + // That should have triggered a redirect, wait for the main test selector to come up. + MountTestComponent(); + WaitUntilExists(By.Id("globalization-cases")); + + var cultureDisplay = WaitUntilExists(By.Id("culture-name-display")); + Assert.Equal($"Culture is: {culture}", cultureDisplay.Text); + + // int + var input = Browser.FindElement(By.Id("input_type_text_int")); + var display = Browser.FindElement(By.Id("input_type_text_int_value")); + Browser.Equal(42.ToString(cultureInfo), () => display.Text); + + input.Clear(); + input.SendKeys(9000.ToString("0,000", cultureInfo)); + input.SendKeys("\t"); + Browser.Equal(9000.ToString(cultureInfo), () => display.Text); + + // decimal + input = Browser.FindElement(By.Id("input_type_text_decimal")); + display = Browser.FindElement(By.Id("input_type_text_decimal_value")); + Browser.Equal(4.2m.ToString(cultureInfo), () => display.Text); + + input.Clear(); + input.SendKeys(9000.42m.ToString("0,000.00", cultureInfo)); + input.SendKeys("\t"); + Browser.Equal(9000.42m.ToString(cultureInfo), () => display.Text); + + // datetime + input = Browser.FindElement(By.Id("input_type_text_datetime")); + display = Browser.FindElement(By.Id("input_type_text_datetime_value")); + Browser.Equal(new DateTime(1985, 3, 4).ToString(cultureInfo), () => display.Text); + + ReplaceText(input, new DateTime(2000, 1, 2).ToString(cultureInfo)); + input.SendKeys("\t"); + Browser.Equal(new DateTime(2000, 1, 2).ToString(cultureInfo), () => display.Text); + + // datetimeoffset + input = Browser.FindElement(By.Id("input_type_text_datetimeoffset")); + display = Browser.FindElement(By.Id("input_type_text_datetimeoffset_value")); + Browser.Equal(new DateTimeOffset(new DateTime(1985, 3, 4)).ToString(cultureInfo), () => display.Text); + + ReplaceText(input, new DateTimeOffset(new DateTime(2000, 1, 2)).ToString(cultureInfo)); + input.SendKeys("\t"); + Browser.Equal(new DateTimeOffset(new DateTime(2000, 1, 2)).ToString(cultureInfo), () => display.Text); + } + + // see: https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/214 + // + // Calling Clear() can trigger onchange, which will revert the value to its default. + private static void ReplaceText(IWebElement element, string text) + { + element.SendKeys(Keys.Control + "a"); + element.SendKeys(text); + } + } +} diff --git a/src/Components/test/testassets/BasicTestApp/GlobalizationBindCases.razor b/src/Components/test/testassets/BasicTestApp/GlobalizationBindCases.razor new file mode 100644 index 0000000000..bbab6ffde2 --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/GlobalizationBindCases.razor @@ -0,0 +1,35 @@ +

Globalization Bind Cases

+

Culture is: @System.Globalization.CultureInfo.CurrentCulture.Name

+ +
+

Numbers using bind in text fields

+
+ int: + @inputTypeTextInt +
+
+ decimal: + @inputTypeTextDecimal +
+
+ +
+

Dates using bind in text fields

+
+ DateTime: + @inputTypeTextDateTime +
+
+ DateTimeOffset: + @inputTypeTextDateTimeOffset +
+
+ + +@code { + int inputTypeTextInt = 42; + decimal inputTypeTextDecimal = 4.2m; + + DateTime inputTypeTextDateTime = new DateTime(1985, 3, 4); + DateTimeOffset inputTypeTextDateTimeOffset = new DateTimeOffset(new DateTime(1985, 3, 4)); +} diff --git a/src/Components/test/testassets/BasicTestApp/Index.razor b/src/Components/test/testassets/BasicTestApp/Index.razor index d48449cac6..8f090e6cbe 100644 --- a/src/Components/test/testassets/BasicTestApp/Index.razor +++ b/src/Components/test/testassets/BasicTestApp/Index.razor @@ -62,6 +62,7 @@ + @System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription