2
0

charts.test.ts 3.0 KB

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