charts.test.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import {
  2. Spreadsheet,
  3. tryParseCells,
  4. tryParseNumber,
  5. VALID_SPREADSHEET,
  6. } from "./charts";
  7. describe("charts", () => {
  8. describe("tryParseNumber", () => {
  9. it.each<[string, number]>([
  10. ["1", 1],
  11. ["0", 0],
  12. ["-1", -1],
  13. ["0.1", 0.1],
  14. [".1", 0.1],
  15. ["1.", 1],
  16. ["424.", 424],
  17. ["$1", 1],
  18. ["-.1", -0.1],
  19. ["-$1", -1],
  20. ["$-1", -1],
  21. ])("should correctly identify %s as numbers", (given, expected) => {
  22. expect(tryParseNumber(given)).toEqual(expected);
  23. });
  24. it.each<[string]>([["a"], ["$"], ["$a"], ["-$a"]])(
  25. "should correctly identify %s as not a number",
  26. (given) => {
  27. expect(tryParseNumber(given)).toBeNull();
  28. },
  29. );
  30. });
  31. describe("tryParseCells", () => {
  32. it("Successfully parses a spreadsheet", () => {
  33. const spreadsheet = [
  34. ["time", "value"],
  35. ["01:00", "61"],
  36. ["02:00", "-60"],
  37. ["03:00", "85"],
  38. ["04:00", "-67"],
  39. ["05:00", "54"],
  40. ["06:00", "95"],
  41. ];
  42. const result = tryParseCells(spreadsheet);
  43. expect(result.type).toBe(VALID_SPREADSHEET);
  44. const { title, labels, values } = (
  45. result as { type: typeof VALID_SPREADSHEET; spreadsheet: Spreadsheet }
  46. ).spreadsheet;
  47. expect(title).toEqual("value");
  48. expect(labels).toEqual([
  49. "01:00",
  50. "02:00",
  51. "03:00",
  52. "04:00",
  53. "05:00",
  54. "06:00",
  55. ]);
  56. expect(values).toEqual([61, -60, 85, -67, 54, 95]);
  57. });
  58. it("Uses the second column as the label if it is not a number", () => {
  59. const spreadsheet = [
  60. ["time", "value"],
  61. ["01:00", "61"],
  62. ["02:00", "-60"],
  63. ["03:00", "85"],
  64. ["04:00", "-67"],
  65. ["05:00", "54"],
  66. ["06:00", "95"],
  67. ];
  68. const result = tryParseCells(spreadsheet);
  69. expect(result.type).toBe(VALID_SPREADSHEET);
  70. const { title, labels, values } = (
  71. result as { type: typeof VALID_SPREADSHEET; spreadsheet: Spreadsheet }
  72. ).spreadsheet;
  73. expect(title).toEqual("value");
  74. expect(labels).toEqual([
  75. "01:00",
  76. "02:00",
  77. "03:00",
  78. "04:00",
  79. "05:00",
  80. "06:00",
  81. ]);
  82. expect(values).toEqual([61, -60, 85, -67, 54, 95]);
  83. });
  84. it("treats the first column as labels if both columns are numbers", () => {
  85. const spreadsheet = [
  86. ["time", "value"],
  87. ["01", "61"],
  88. ["02", "-60"],
  89. ["03", "85"],
  90. ["04", "-67"],
  91. ["05", "54"],
  92. ["06", "95"],
  93. ];
  94. const result = tryParseCells(spreadsheet);
  95. expect(result.type).toBe(VALID_SPREADSHEET);
  96. const { title, labels, values } = (
  97. result as { type: typeof VALID_SPREADSHEET; spreadsheet: Spreadsheet }
  98. ).spreadsheet;
  99. expect(title).toEqual("value");
  100. expect(labels).toEqual(["01", "02", "03", "04", "05", "06"]);
  101. expect(values).toEqual([61, -60, 85, -67, 54, 95]);
  102. });
  103. });
  104. });