From 58f07d0266511e29fa67db6c6c054921c5339992 Mon Sep 17 00:00:00 2001 From: Thomas Lauf Date: Sat, 18 Feb 2017 23:04:44 +0100 Subject: [PATCH] TI-46: Display error in visual reports (day,week,month) - Fix calculation of end_mins - Add tests --- ChangeLog | 2 + src/commands/CmdChart.cpp | 7 +-- test/chart.t | 105 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index d2a1af41..ef58e21a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,8 @@ (thanks to Jan Stolarek) - TI-42 refresh holiday script throws an error on nb-NO locale (thanks to Jelle van der Waa). +- TI-46 Display error in visual reports (day,week,month) + (thanks to Michael Meier) - TI-47 first call successfully creates new database but returns exit status 1 (thanks to Georg Sauthoff). - TI-49 new theme files aren't installed diff --git a/src/commands/CmdChart.cpp b/src/commands/CmdChart.cpp index 0b45b383..10a5d641 100644 --- a/src/commands/CmdChart.cpp +++ b/src/commands/CmdChart.cpp @@ -543,13 +543,14 @@ static void renderInterval ( auto start_mins = (clipped.range.start.hour () - first_hour) * 60 + clipped.range.start.minute (); auto end_mins = (clipped.range.end.hour () - first_hour) * 60 + clipped.range.end.minute (); - if (end_mins == 0) - end_mins = (23 * 60) + 59; + + if (clipped.range.end.hour () == 0) + end_mins += (clipped.range.end.day() - clipped.range.start.day()) * 24 * 60; work = clipped.range.total (); auto start_block = quantizeToNMinutes (start_mins, cell) / cell; - auto end_block = quantizeToNMinutes (end_mins == 0 ? 60 : end_mins, cell) / cell; + auto end_block = quantizeToNMinutes (end_mins == start_mins ? start_mins + 60 : end_mins, cell) / cell; int start_offset = start_block + (spacing * (start_mins / 60)); int end_offset = end_block + (spacing * (end_mins / 60)); diff --git a/test/chart.t b/test/chart.t index b2b9984b..464bf5e6 100755 --- a/test/chart.t +++ b/test/chart.t @@ -93,6 +93,111 @@ class TestChart(TestCase): self.assertIn("Invalid value for 'reports.month.cell': 'foobar'", err) + def test_chart_day_with_less_than_one_minute_interval_at_day_start(self): + self.t("track 2016-01-15T00:00:00 - 2016-01-15T00:00:40 XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO") + code, out, err = self.t("day 2016-01-15 - 2016-01-16") + + self.assertIn("""\ +\nFri 15 XOXO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 \ +\n XOXO \ +\n + Tracked 0:00:40 + Available 23:59:20 + Total 24:00:00 + +""", out) + + def test_chart_day_with_less_than_one_minute_interval(self): + self.t( + "track 2016-01-15T02:00:00 - 2016-01-15T02:00:40 XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO") + code, out, err = self.t("day 2016-01-15 - 2016-01-16") + + self.assertIn("""\ +\nFri 15 0 1 XOXO 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 \ +\n XOXO \ +\n + Tracked 0:00:40 + Available 23:59:20 + Total 24:00:00 + +""", out) + + def test_chart_day_with_less_than_one_hour_interval_at_day_start(self): + self.t( + "track 2016-01-15T00:00:00 - 2016-01-15T00:30:00 XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO") + code, out, err = self.t("day 2016-01-15 - 2016-01-16") + + self.assertIn("""\ +\nFri 15 XO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 \ +\n XO \ +\n + Tracked 0:30:00 + Available 23:30:00 + Total 24:00:00 + +""", out) + + def test_chart_day_with_less_than_one_hour_interval(self): + self.t( + "track 2016-01-15T02:00:00 - 2016-01-15T02:30:00 XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO") + code, out, err = self.t("day 2016-01-15 - 2016-01-16") + + self.assertIn("""\ +\nFri 15 0 1 XO 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 \ +\n XO \ +\n + Tracked 0:30:00 + Available 23:30:00 + Total 24:00:00 + +""", out) + + def test_chart_day_with_interval_over_day_border(self): + self.t( + "track 2016-01-15T23:00:00 - 2016-01-16T01:00:00 XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO") + + code, out, err = self.t("day 2016-01-15 - 2016-01-17") + self.assertIn("""\ +\nFri 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 XOXOX\ +\n OXOXO\ +\nSat 16 XOXOX1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 \ +\n OXOXO \ +\n + Tracked 2:00:00 + Available 46:00:00 + Total 48:00:00 + +""", out) + + def test_chart_day_with_interval_over_day_border(self): + self.t("track 2016-01-15T23:00:00 - 2016-01-16T01:00:00 XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO") + code, out, err = self.t("day 2016-01-15 - 2016-01-17") + + self.assertIn("""\ +\nFri 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 XOXOX\ +\n OXOXO\ +\nSat 16 XOXOX1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 \ +\n OXOXO \ +\n + Tracked 2:00:00 + Available 46:00:00 + Total 48:00:00 + +""", out) + + def test_chart_day_with_interval_over_whole_day(self): + self.t("track 2016-01-15T00:00:00 - 2016-01-16T00:00:00 XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO") + code, out, err = self.t("day 2016-01-15 - 2016-01-16") + + self.assertIn("""\ +\nFri 15 XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO\ +\n XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO\ +\n + Tracked 24:00:00 + Available 0:00:00 + Total 24:00:00 + +""", out) if __name__ == "__main__": from simpletap import TAPTestRunner