Duration.compare.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. describe("correct behavior", () => {
  2. test("length is 2", () => {
  3. expect(Temporal.Duration.compare).toHaveLength(2);
  4. });
  5. function checkCommonResults(duration1, duration2) {
  6. expect(Temporal.Duration.compare(duration1, duration1)).toBe(0);
  7. expect(Temporal.Duration.compare(duration2, duration2)).toBe(0);
  8. expect(Temporal.Duration.compare(duration1, duration2)).toBe(-1);
  9. expect(Temporal.Duration.compare(duration2, duration1)).toBe(1);
  10. }
  11. test("basic functionality", () => {
  12. const duration1 = new Temporal.Duration(0, 0, 0, 1);
  13. const duration2 = new Temporal.Duration(0, 0, 0, 2);
  14. checkCommonResults(duration1, duration2);
  15. });
  16. test("duration-like objects", () => {
  17. const duration1 = { years: 0, months: 0, weeks: 0, days: 1 };
  18. const duration2 = { years: 0, months: 0, weeks: 0, days: 2 };
  19. checkCommonResults(duration1, duration2);
  20. });
  21. test("duration strings", () => {
  22. const duration1 = "P1D";
  23. const duration2 = "P2D";
  24. checkCommonResults(duration1, duration2);
  25. });
  26. });
  27. describe("errors", () => {
  28. test("invalid duration-like object", () => {
  29. expect(() => {
  30. Temporal.Duration.compare({});
  31. }).toThrowWithMessage(TypeError, "Invalid duration-like object");
  32. expect(() => {
  33. Temporal.Duration.compare({ years: 0, months: 0, weeks: 0, days: 1 }, {});
  34. }).toThrowWithMessage(TypeError, "Invalid duration-like object");
  35. });
  36. test("relativeTo is required for comparing calendar units (year, month, week)", () => {
  37. const duration1 = new Temporal.Duration(1);
  38. const duration2 = new Temporal.Duration(2);
  39. expect(() => {
  40. Temporal.Duration.compare(duration1, duration2);
  41. }).toThrowWithMessage(
  42. RangeError,
  43. "A starting point is required for balancing calendar units"
  44. );
  45. const duration3 = new Temporal.Duration(0, 3);
  46. const duration4 = new Temporal.Duration(0, 4);
  47. expect(() => {
  48. Temporal.Duration.compare(duration3, duration4);
  49. }).toThrowWithMessage(
  50. RangeError,
  51. "A starting point is required for balancing calendar units"
  52. );
  53. const duration5 = new Temporal.Duration(0, 0, 5);
  54. const duration6 = new Temporal.Duration(0, 0, 6);
  55. expect(() => {
  56. Temporal.Duration.compare(duration5, duration6);
  57. }).toThrowWithMessage(
  58. RangeError,
  59. "A starting point is required for balancing calendar units"
  60. );
  61. // Still throws if year/month/week of one the duration objects is non-zero.
  62. const duration7 = new Temporal.Duration(0, 0, 0, 7);
  63. const duration8 = new Temporal.Duration(0, 0, 8);
  64. expect(() => {
  65. Temporal.Duration.compare(duration7, duration8);
  66. }).toThrowWithMessage(
  67. RangeError,
  68. "A starting point is required for balancing calendar units"
  69. );
  70. const duration9 = new Temporal.Duration(0, 0, 9);
  71. const duration10 = new Temporal.Duration(0, 0, 0, 10);
  72. expect(() => {
  73. Temporal.Duration.compare(duration9, duration10);
  74. }).toThrowWithMessage(
  75. RangeError,
  76. "A starting point is required for balancing calendar units"
  77. );
  78. });
  79. test("custom time zone doesn't have a getOffsetNanosecondsFor function", () => {
  80. const zonedDateTime = new Temporal.ZonedDateTime(0n, {});
  81. const duration = new Temporal.Duration();
  82. expect(() => {
  83. Temporal.Duration.compare(duration, duration, { relativeTo: zonedDateTime });
  84. }).toThrowWithMessage(TypeError, "null is not a function");
  85. });
  86. });