PlainDateTime.from.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. describe("correct behavior", () => {
  2. test("length is 1", () => {
  3. expect(Temporal.PlainDateTime.from).toHaveLength(1);
  4. });
  5. test("PlainDate instance argument", () => {
  6. const plainDate = new Temporal.PlainDate(2021, 7, 6);
  7. const plainDateTime = Temporal.PlainDateTime.from(plainDate);
  8. expect(plainDateTime.year).toBe(2021);
  9. expect(plainDateTime.month).toBe(7);
  10. expect(plainDateTime.day).toBe(6);
  11. expect(plainDateTime.hour).toBe(0);
  12. expect(plainDateTime.minute).toBe(0);
  13. expect(plainDateTime.second).toBe(0);
  14. expect(plainDateTime.millisecond).toBe(0);
  15. expect(plainDateTime.microsecond).toBe(0);
  16. expect(plainDateTime.nanosecond).toBe(0);
  17. });
  18. test("PlainDateTime instance argument", () => {
  19. const plainDateTime_ = new Temporal.PlainDateTime(2021, 7, 6, 18, 14, 47);
  20. const plainDateTime = Temporal.PlainDateTime.from(plainDateTime_);
  21. expect(plainDateTime).not.toBe(plainDateTime_);
  22. expect(plainDateTime.year).toBe(2021);
  23. expect(plainDateTime.month).toBe(7);
  24. expect(plainDateTime.day).toBe(6);
  25. expect(plainDateTime.hour).toBe(18);
  26. expect(plainDateTime.minute).toBe(14);
  27. expect(plainDateTime.second).toBe(47);
  28. expect(plainDateTime.millisecond).toBe(0);
  29. expect(plainDateTime.microsecond).toBe(0);
  30. expect(plainDateTime.nanosecond).toBe(0);
  31. });
  32. test("ZonedDateTime instance argument", () => {
  33. const timeZone = new Temporal.TimeZone("UTC");
  34. const zonedDateTime = new Temporal.ZonedDateTime(1625614921000000000n, timeZone);
  35. const plainDateTime = Temporal.PlainDateTime.from(zonedDateTime);
  36. expect(plainDateTime.year).toBe(2021);
  37. expect(plainDateTime.month).toBe(7);
  38. expect(plainDateTime.day).toBe(6);
  39. expect(plainDateTime.hour).toBe(23);
  40. expect(plainDateTime.minute).toBe(42);
  41. expect(plainDateTime.second).toBe(1);
  42. expect(plainDateTime.millisecond).toBe(0);
  43. expect(plainDateTime.microsecond).toBe(0);
  44. expect(plainDateTime.nanosecond).toBe(0);
  45. });
  46. test("fields object argument", () => {
  47. const object = {
  48. year: 2021,
  49. month: 7,
  50. day: 6,
  51. hour: 23,
  52. minute: 42,
  53. second: 1,
  54. millisecond: 0,
  55. microsecond: 0,
  56. nanosecond: 0,
  57. };
  58. const plainDateTime = Temporal.PlainDateTime.from(object);
  59. expect(plainDateTime.year).toBe(2021);
  60. expect(plainDateTime.month).toBe(7);
  61. expect(plainDateTime.day).toBe(6);
  62. expect(plainDateTime.hour).toBe(23);
  63. expect(plainDateTime.minute).toBe(42);
  64. expect(plainDateTime.second).toBe(1);
  65. expect(plainDateTime.millisecond).toBe(0);
  66. expect(plainDateTime.microsecond).toBe(0);
  67. expect(plainDateTime.nanosecond).toBe(0);
  68. });
  69. test("with 'constrain' overflow option", () => {
  70. const object = {
  71. year: 0,
  72. month: 1,
  73. day: 1,
  74. hour: 24,
  75. minute: 60,
  76. second: 60,
  77. millisecond: 1000,
  78. microsecond: 1000,
  79. nanosecond: 1000,
  80. };
  81. const plainDateTime = Temporal.PlainDateTime.from(object, { overflow: "constrain" });
  82. expect(plainDateTime.year).toBe(0);
  83. expect(plainDateTime.month).toBe(1);
  84. expect(plainDateTime.day).toBe(1);
  85. expect(plainDateTime.hour).toBe(23);
  86. expect(plainDateTime.minute).toBe(59);
  87. expect(plainDateTime.second).toBe(59);
  88. expect(plainDateTime.millisecond).toBe(999);
  89. expect(plainDateTime.microsecond).toBe(999);
  90. expect(plainDateTime.nanosecond).toBe(999);
  91. });
  92. test("PlainDateTime string argument", () => {
  93. const plainDateTime = Temporal.PlainDateTime.from("2021-07-06T23:42:01");
  94. expect(plainDateTime.year).toBe(2021);
  95. expect(plainDateTime.month).toBe(7);
  96. expect(plainDateTime.day).toBe(6);
  97. expect(plainDateTime.hour).toBe(23);
  98. expect(plainDateTime.minute).toBe(42);
  99. expect(plainDateTime.second).toBe(1);
  100. expect(plainDateTime.millisecond).toBe(0);
  101. expect(plainDateTime.microsecond).toBe(0);
  102. expect(plainDateTime.nanosecond).toBe(0);
  103. });
  104. });
  105. describe("errors", () => {
  106. test("missing fields", () => {
  107. expect(() => {
  108. Temporal.PlainDateTime.from({});
  109. }).toThrowWithMessage(TypeError, "Required property day is missing or undefined");
  110. expect(() => {
  111. Temporal.PlainDateTime.from({ year: 0, day: 1 });
  112. }).toThrowWithMessage(TypeError, "Required property month is missing or undefined");
  113. expect(() => {
  114. Temporal.PlainDateTime.from({ month: 1, day: 1 });
  115. }).toThrowWithMessage(TypeError, "Required property year is missing or undefined");
  116. });
  117. test("with 'reject' overflow option", () => {
  118. const values = [
  119. [{ year: 1234567, month: 1, day: 1 }, "Invalid plain date"],
  120. [{ year: 0, month: 13, day: 1 }, "Invalid plain date"],
  121. [{ year: 0, month: 1, day: 32 }, "Invalid plain date"],
  122. [{ year: 0, month: 1, day: 1, hour: 24 }, "Invalid plain time"],
  123. [{ year: 0, month: 1, day: 1, hour: 0, minute: 60 }, "Invalid plain time"],
  124. [{ year: 0, month: 1, day: 1, hour: 0, minute: 0, second: 60 }, "Invalid plain time"],
  125. [
  126. { year: 0, month: 1, day: 1, hour: 0, minute: 0, second: 0, millisecond: 1000 },
  127. "Invalid plain time",
  128. ],
  129. [
  130. {
  131. year: 0,
  132. month: 1,
  133. day: 1,
  134. hour: 0,
  135. minute: 0,
  136. second: 0,
  137. millisecond: 0,
  138. microsecond: 1000,
  139. },
  140. "Invalid plain time",
  141. ],
  142. [
  143. {
  144. year: 0,
  145. month: 1,
  146. day: 1,
  147. hour: 0,
  148. minute: 0,
  149. second: 0,
  150. millisecond: 0,
  151. microsecond: 0,
  152. nanosecond: 1000,
  153. },
  154. "Invalid plain time",
  155. ],
  156. ];
  157. for (const [object, error] of values) {
  158. expect(() => {
  159. Temporal.PlainDateTime.from(object, { overflow: "reject" });
  160. }).toThrowWithMessage(RangeError, error);
  161. }
  162. });
  163. });
  164. describe("errors", () => {
  165. test("custom time zone doesn't have a getOffsetNanosecondsFor function", () => {
  166. const zonedDateTime = new Temporal.ZonedDateTime(0n, {});
  167. expect(() => {
  168. Temporal.PlainDateTime.from(zonedDateTime);
  169. }).toThrowWithMessage(TypeError, "getOffsetNanosecondsFor is undefined");
  170. });
  171. test("string must not contain a UTC designator", () => {
  172. expect(() => {
  173. Temporal.PlainDateTime.from("2021-07-06T23:42:01Z");
  174. }).toThrowWithMessage(
  175. RangeError,
  176. "Invalid date time string '2021-07-06T23:42:01Z': must not contain a UTC designator"
  177. );
  178. });
  179. test("extended year must not be negative zero", () => {
  180. expect(() => {
  181. Temporal.PlainDateTime.from("-000000-01-01");
  182. }).toThrowWithMessage(RangeError, "Invalid date time string '-000000-01-01'");
  183. expect(() => {
  184. Temporal.PlainDateTime.from("−000000-01-01"); // U+2212
  185. }).toThrowWithMessage(RangeError, "Invalid date time string '−000000-01-01'");
  186. });
  187. });