|  | @@ -0,0 +1,121 @@
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  Spreadsheet,
 | 
	
		
			
				|  |  | +  tryParseCells,
 | 
	
		
			
				|  |  | +  tryParseNumber,
 | 
	
		
			
				|  |  | +  VALID_SPREADSHEET,
 | 
	
		
			
				|  |  | +} from "./charts";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +describe("charts", () => {
 | 
	
		
			
				|  |  | +  describe("tryParseNumber", () => {
 | 
	
		
			
				|  |  | +    it.each<[string, number]>([
 | 
	
		
			
				|  |  | +      ["1", 1],
 | 
	
		
			
				|  |  | +      ["0", 0],
 | 
	
		
			
				|  |  | +      ["-1", -1],
 | 
	
		
			
				|  |  | +      ["0.1", 0.1],
 | 
	
		
			
				|  |  | +      [".1", 0.1],
 | 
	
		
			
				|  |  | +      ["1.", 1],
 | 
	
		
			
				|  |  | +      ["424.", 424],
 | 
	
		
			
				|  |  | +      ["$1", 1],
 | 
	
		
			
				|  |  | +      ["-.1", -0.1],
 | 
	
		
			
				|  |  | +      ["-$1", -1],
 | 
	
		
			
				|  |  | +      ["$-1", -1],
 | 
	
		
			
				|  |  | +    ])("should correctly identify %s as numbers", (given, expected) => {
 | 
	
		
			
				|  |  | +      expect(tryParseNumber(given)).toEqual(expected);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    it.each<[string]>([["a"], ["$"], ["$a"], ["-$a"]])(
 | 
	
		
			
				|  |  | +      "should correctly identify %s as not a number",
 | 
	
		
			
				|  |  | +      (given) => {
 | 
	
		
			
				|  |  | +        expect(tryParseNumber(given)).toBeNull();
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  describe("tryParseCells", () => {
 | 
	
		
			
				|  |  | +    it("Successfully parses a spreadsheet", () => {
 | 
	
		
			
				|  |  | +      const spreadsheet = [
 | 
	
		
			
				|  |  | +        ["time", "value"],
 | 
	
		
			
				|  |  | +        ["01:00", "61"],
 | 
	
		
			
				|  |  | +        ["02:00", "-60"],
 | 
	
		
			
				|  |  | +        ["03:00", "85"],
 | 
	
		
			
				|  |  | +        ["04:00", "-67"],
 | 
	
		
			
				|  |  | +        ["05:00", "54"],
 | 
	
		
			
				|  |  | +        ["06:00", "95"],
 | 
	
		
			
				|  |  | +      ];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const result = tryParseCells(spreadsheet);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      expect(result.type).toBe(VALID_SPREADSHEET);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const { title, labels, values } = (
 | 
	
		
			
				|  |  | +        result as { type: typeof VALID_SPREADSHEET; spreadsheet: Spreadsheet }
 | 
	
		
			
				|  |  | +      ).spreadsheet;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      expect(title).toEqual("value");
 | 
	
		
			
				|  |  | +      expect(labels).toEqual([
 | 
	
		
			
				|  |  | +        "01:00",
 | 
	
		
			
				|  |  | +        "02:00",
 | 
	
		
			
				|  |  | +        "03:00",
 | 
	
		
			
				|  |  | +        "04:00",
 | 
	
		
			
				|  |  | +        "05:00",
 | 
	
		
			
				|  |  | +        "06:00",
 | 
	
		
			
				|  |  | +      ]);
 | 
	
		
			
				|  |  | +      expect(values).toEqual([61, -60, 85, -67, 54, 95]);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    it("Uses the second column as the label if it is not a number", () => {
 | 
	
		
			
				|  |  | +      const spreadsheet = [
 | 
	
		
			
				|  |  | +        ["time", "value"],
 | 
	
		
			
				|  |  | +        ["01:00", "61"],
 | 
	
		
			
				|  |  | +        ["02:00", "-60"],
 | 
	
		
			
				|  |  | +        ["03:00", "85"],
 | 
	
		
			
				|  |  | +        ["04:00", "-67"],
 | 
	
		
			
				|  |  | +        ["05:00", "54"],
 | 
	
		
			
				|  |  | +        ["06:00", "95"],
 | 
	
		
			
				|  |  | +      ];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const result = tryParseCells(spreadsheet);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      expect(result.type).toBe(VALID_SPREADSHEET);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const { title, labels, values } = (
 | 
	
		
			
				|  |  | +        result as { type: typeof VALID_SPREADSHEET; spreadsheet: Spreadsheet }
 | 
	
		
			
				|  |  | +      ).spreadsheet;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      expect(title).toEqual("value");
 | 
	
		
			
				|  |  | +      expect(labels).toEqual([
 | 
	
		
			
				|  |  | +        "01:00",
 | 
	
		
			
				|  |  | +        "02:00",
 | 
	
		
			
				|  |  | +        "03:00",
 | 
	
		
			
				|  |  | +        "04:00",
 | 
	
		
			
				|  |  | +        "05:00",
 | 
	
		
			
				|  |  | +        "06:00",
 | 
	
		
			
				|  |  | +      ]);
 | 
	
		
			
				|  |  | +      expect(values).toEqual([61, -60, 85, -67, 54, 95]);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    it("treats the first column as labels if both columns are numbers", () => {
 | 
	
		
			
				|  |  | +      const spreadsheet = [
 | 
	
		
			
				|  |  | +        ["time", "value"],
 | 
	
		
			
				|  |  | +        ["01", "61"],
 | 
	
		
			
				|  |  | +        ["02", "-60"],
 | 
	
		
			
				|  |  | +        ["03", "85"],
 | 
	
		
			
				|  |  | +        ["04", "-67"],
 | 
	
		
			
				|  |  | +        ["05", "54"],
 | 
	
		
			
				|  |  | +        ["06", "95"],
 | 
	
		
			
				|  |  | +      ];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const result = tryParseCells(spreadsheet);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      expect(result.type).toBe(VALID_SPREADSHEET);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const { title, labels, values } = (
 | 
	
		
			
				|  |  | +        result as { type: typeof VALID_SPREADSHEET; spreadsheet: Spreadsheet }
 | 
	
		
			
				|  |  | +      ).spreadsheet;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      expect(title).toEqual("value");
 | 
	
		
			
				|  |  | +      expect(labels).toEqual(["01", "02", "03", "04", "05", "06"]);
 | 
	
		
			
				|  |  | +      expect(values).toEqual([61, -60, 85, -67, 54, 95]);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +});
 |