You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DateTimeFieldZoneIdTest.java 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package com.vaadin.tests.components.datefield;
  2. import static com.vaadin.tests.components.datefield.DateTimeFieldZoneId.INITIAL_DATE_TIME;
  3. import static com.vaadin.tests.components.datefield.DateTimeFieldZoneId.LOCALE_ID;
  4. import static com.vaadin.tests.components.datefield.DateTimeFieldZoneId.PATTERN_ID;
  5. import static com.vaadin.tests.components.datefield.DateTimeFieldZoneId.ZONE_ID;
  6. import static java.time.temporal.ChronoUnit.MONTHS;
  7. import static org.junit.Assert.assertTrue;
  8. import java.time.Duration;
  9. import java.time.Instant;
  10. import java.time.LocalDate;
  11. import java.time.LocalDateTime;
  12. import java.time.ZoneId;
  13. import java.util.List;
  14. import java.util.TimeZone;
  15. import org.junit.Test;
  16. import org.openqa.selenium.JavascriptExecutor;
  17. import org.openqa.selenium.remote.DesiredCapabilities;
  18. import com.vaadin.testbench.elements.ComboBoxElement;
  19. import com.vaadin.testbench.elements.DateTimeFieldElement;
  20. import com.vaadin.testbench.elements.TextFieldElement;
  21. import com.vaadin.testbench.parallel.Browser;
  22. import com.vaadin.tests.tb3.MultiBrowserTest;
  23. public class DateTimeFieldZoneIdTest extends MultiBrowserTest {
  24. @Override
  25. public List<DesiredCapabilities> getBrowsersToTest() {
  26. // IE11 and PhantomJS don't support getting timezone
  27. return getBrowserCapabilities(Browser.CHROME, Browser.FIREFOX);
  28. }
  29. private static LocalDateTime THIRTY_OF_JULY = INITIAL_DATE_TIME
  30. .plus(6, MONTHS).withDayOfMonth(30);
  31. @Test
  32. public void defaultDisplayName() {
  33. openTestURL();
  34. DateTimeFieldElement dateField = $(DateTimeFieldElement.class).first();
  35. dateField.openPopup();
  36. LocalDate initialDate = INITIAL_DATE_TIME.toLocalDate();
  37. assertEndsWith(dateField, getUTCString(initialDate));
  38. dateField.setDateTime(THIRTY_OF_JULY);
  39. assertEndsWith(dateField, getUTCString(THIRTY_OF_JULY.toLocalDate()));
  40. }
  41. @Test
  42. public void zoneIdTokyo() {
  43. openTestURL();
  44. DateTimeFieldElement dateField = $(DateTimeFieldElement.class).first();
  45. setZoneId("Asia/Tokyo");
  46. dateField.openPopup();
  47. assertEndsWith(dateField, "JST");
  48. dateField.setDateTime(THIRTY_OF_JULY);
  49. assertEndsWith(dateField, "JST");
  50. }
  51. @Test
  52. public void zoneIdBerlin() {
  53. openTestURL();
  54. DateTimeFieldElement dateField = $(DateTimeFieldElement.class).first();
  55. setZoneId("Europe/Berlin");
  56. dateField.openPopup();
  57. assertEndsWith(dateField, "CET");
  58. dateField.setDateTime(THIRTY_OF_JULY);
  59. assertEndsWith(dateField, "CEST");
  60. }
  61. @Test
  62. public void defaultDisplayNameLocaleGerman() {
  63. openTestURL();
  64. setLocale("de");
  65. DateTimeFieldElement dateField = $(DateTimeFieldElement.class).first();
  66. dateField.openPopup();
  67. assertEndsWith(dateField,
  68. getUTCString(INITIAL_DATE_TIME.toLocalDate()));
  69. dateField.setDateTime(THIRTY_OF_JULY);
  70. assertEndsWith(dateField, getUTCString(THIRTY_OF_JULY.toLocalDate()));
  71. }
  72. @Test
  73. public void zoneIdBeirutLocaleGerman() {
  74. openTestURL();
  75. DateTimeFieldElement dateField = $(DateTimeFieldElement.class).first();
  76. setZoneId("Asia/Beirut");
  77. setLocale("de");
  78. dateField.openPopup();
  79. assertEndsWith(dateField, "OEZ");
  80. dateField.setDateTime(THIRTY_OF_JULY);
  81. assertEndsWith(dateField, "OESZ");
  82. }
  83. @Test
  84. public void zInQuotes() {
  85. openTestURL();
  86. DateTimeFieldElement dateField = $(DateTimeFieldElement.class).first();
  87. setZoneId("Asia/Tokyo");
  88. TextFieldElement patternField = $(TextFieldElement.class)
  89. .id(PATTERN_ID);
  90. patternField.setValue("dd MMM yyyy - hh:mm:ss a 'z' z");
  91. dateField.openPopup();
  92. assertEndsWith(dateField, "z JST");
  93. dateField.setDateTime(THIRTY_OF_JULY);
  94. assertEndsWith(dateField, "z JST");
  95. }
  96. private void assertEndsWith(DateTimeFieldElement element, String suffix) {
  97. String text = element.getValue();
  98. assertTrue(text + " should end with " + suffix, text.endsWith(suffix));
  99. }
  100. /**
  101. * Returns the timezone name formatted as returned by
  102. * {@link com.google.gwt.i18n.client.DateTimeFormat}, which supports only
  103. * standard GMT and RFC format.
  104. *
  105. * The {@link ZoneId} used is the operating system default
  106. */
  107. private String getUTCString(LocalDate localDate) {
  108. // Get the TimeZone from browser
  109. String browserTimeZone = ((JavascriptExecutor) getDriver())
  110. .executeScript(
  111. "return Intl.DateTimeFormat().resolvedOptions().timeZone;")
  112. .toString();
  113. TimeZone timeZone = TimeZone.getTimeZone(browserTimeZone);
  114. Instant instant = localDate.atStartOfDay().atZone(timeZone.toZoneId())
  115. .toInstant();
  116. Duration duration = Duration
  117. .ofMillis(timeZone.getOffset(instant.toEpochMilli()));
  118. String suffix;
  119. if (duration.toMinutes() == 0) {
  120. suffix = "";
  121. } else {
  122. long minutes = duration.toMinutes()
  123. % Duration.ofHours(1).toMinutes();
  124. long hours = duration.toHours();
  125. suffix = (hours >= 0 ? "+" : "") + hours
  126. + (minutes != 0 ? ":" + minutes : "");
  127. }
  128. return "UTC" + suffix;
  129. }
  130. private void setZoneId(String zoneId) {
  131. ComboBoxElement zoneIdComboBox = $(ComboBoxElement.class).id(ZONE_ID);
  132. zoneIdComboBox.selectByText(zoneId);
  133. }
  134. private void setLocale(String locale) {
  135. ComboBoxElement zoneIdComboBox = $(ComboBoxElement.class).id(LOCALE_ID);
  136. zoneIdComboBox.selectByText(locale);
  137. }
  138. }