local dates = require "activity.dates" local generators = require "activity.generators" local plain = require "activity.formats.plain" local Y2024 = [[ _0000000000000000000000000000000000000000000000000000 Mon 00000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000 Wed 0000000000000000000000000000000000000000000000000000_ 0000000000000000000000000000000000000000000000000000_ Fri 0000000000000000000000000000000000000000000000000000_ 0000000000000000000000000000000000000000000000000000_ ]] local Y2023 = [[ 00000000000000000000000000000000000000000000000000000 Mon 0000000000000000000000000000000000000000000000000000_ 0000000000000000000000000000000000000000000000000000_ Wed 0000000000000000000000000000000000000000000000000000_ 0000000000000000000000000000000000000000000000000000_ Fri 0000000000000000000000000000000000000000000000000000_ 0000000000000000000000000000000000000000000000000000_ ]] local Y2020 = [[ _0000000000000000000000000000000000000000000000000000 Mon _0000000000000000000000000000000000000000000000000000 _0000000000000000000000000000000000000000000000000000 Wed 00000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000 Fri 0000000000000000000000000000000000000000000000000000_ 0000000000000000000000000000000000000000000000000000_ ]] local ROLL = [[ 00000000000000000000000000000000000000000000000000000 Mon 00000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000 Wed 00000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000 Fri 0000000000000000000000000000000000000000000000000000_ 0000000000000000000000000000000000000000000000000000_ ]] local function always_zero (...) return 0 end describe("Yearly chart generator", function() describe("shall generate empty table for year", function() it("2024", function() assert.are.equal(Y2024, generators.generate_table(2024, always_zero, plain)) end) it("2023", function() assert.are.equal(Y2023, generators.generate_table(2023, always_zero, plain)) end) it("2020", function() assert.are.equal(Y2020, generators.generate_table(2020, always_zero, plain)) end) end) describe("shall put activity into cells for", function() local function lookup (year, day) if day < 1 or dates.days_in(year) < day then return 0 end return 1 end it("regular years", function() assert.are.equal(Y2023:gsub("0", "1"), generators.generate_table(2023, lookup, plain)) end) it("leap years", function() assert.are.equal(Y2024:gsub("0", "1"), generators.generate_table(2024, lookup, plain)) end) end) it("shall use entire format", function() mock(plain) _ = generators.generate_table(2023, always_zero, plain) assert.spy(plain.start_document).was.called() assert.spy(plain.start_table).was.called() assert.spy(plain.start_row).was.called() assert.spy(plain.label).was.called(7) assert.spy(plain.spot).was.called(6) assert.spy(plain.cell).was.called(365) assert.spy(plain.end_row).was.called() assert.spy(plain.end_table).was.called() assert.spy(plain.end_document).was.called() mock.revert(plain) end) end) describe("Rolling chart generator", function() local date = os.date("*t", os.time{year=2024, month=2, day=8}) it("shall generate empty table", function() assert.are.equal(ROLL, generators.generate_table("rolling", always_zero, plain, date)) end) it("shall put activity into cells", function() local function lookup (year, day) if year == 2023 and day >= 36 then return 1 end if year == 2024 and day <= 39 then return 1 end return 0 end assert.are.equal(ROLL:gsub("0", "1"), generators.generate_table("rolling", lookup, plain, date)) end) it("shall use entire format", function() mock(plain) _ = generators.generate_table("rolling", always_zero, plain, date) assert.spy(plain.start_document).was.called() assert.spy(plain.start_table).was.called() assert.spy(plain.start_row).was.called() assert.spy(plain.label).was.called(7) assert.spy(plain.spot).was.called(2) assert.spy(plain.cell).was.called(369) assert.spy(plain.end_row).was.called() assert.spy(plain.end_table).was.called() assert.spy(plain.end_document).was.called() mock.revert(plain) end) end)