PlainDateTime.from.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. // Un-skip once ParseISODateTime & ParseTemporalDateString are implemented
  93. test.skip("PlainDateTime string argument", () => {
  94. const plainDateTime = Temporal.PlainDateTime.from("2021-07-06T23:42:01Z");
  95. expect(plainDateTime.year).toBe(2021);
  96. expect(plainDateTime.month).toBe(7);
  97. expect(plainDateTime.day).toBe(6);
  98. expect(plainDateTime.hour).toBe(23);
  99. expect(plainDateTime.minute).toBe(42);
  100. expect(plainDateTime.second).toBe(1);
  101. expect(plainDateTime.millisecond).toBe(0);
  102. expect(plainDateTime.microsecond).toBe(0);
  103. expect(plainDateTime.nanosecond).toBe(0);
  104. });
  105. });
  106. describe("errors", () => {
  107. test("missing fields", () => {
  108. expect(() => {
  109. Temporal.PlainDateTime.from({});
  110. }).toThrowWithMessage(TypeError, "Required property year is missing or undefined");
  111. expect(() => {
  112. Temporal.PlainDateTime.from({ year: 0 });
  113. }).toThrowWithMessage(TypeError, "Required property month is missing or undefined");
  114. expect(() => {
  115. Temporal.PlainDateTime.from({ year: 0, month: 1 });
  116. }).toThrowWithMessage(TypeError, "Required property day is missing or undefined");
  117. });
  118. test("with 'reject' overflow option", () => {
  119. const values = [
  120. [{ year: 1234567, month: 1, day: 1 }, "Invalid plain date"],
  121. [{ year: 0, month: 13, day: 1 }, "Invalid plain date"],
  122. [{ year: 0, month: 1, day: 32 }, "Invalid plain date"],
  123. [{ year: 0, month: 1, day: 1, hour: 24 }, "Invalid plain time"],
  124. [{ year: 0, month: 1, day: 1, hour: 0, minute: 60 }, "Invalid plain time"],
  125. [{ year: 0, month: 1, day: 1, hour: 0, minute: 0, second: 60 }, "Invalid plain time"],
  126. [
  127. { year: 0, month: 1, day: 1, hour: 0, minute: 0, second: 0, millisecond: 1000 },
  128. "Invalid plain time",
  129. ],
  130. [
  131. {
  132. year: 0,
  133. month: 1,
  134. day: 1,
  135. hour: 0,
  136. minute: 0,
  137. second: 0,
  138. millisecond: 0,
  139. microsecond: 1000,
  140. },
  141. "Invalid plain time",
  142. ],
  143. [
  144. {
  145. year: 0,
  146. month: 1,
  147. day: 1,
  148. hour: 0,
  149. minute: 0,
  150. second: 0,
  151. millisecond: 0,
  152. microsecond: 0,
  153. nanosecond: 1000,
  154. },
  155. "Invalid plain time",
  156. ],
  157. ];
  158. for (const [object, error] of values) {
  159. expect(() => {
  160. Temporal.PlainDateTime.from(object, { overflow: "reject" });
  161. }).toThrowWithMessage(RangeError, error);
  162. }
  163. });
  164. });