From 9360e26b46ec0bfb4eca5f8386b94805ae188e3c Mon Sep 17 00:00:00 2001 From: Nick Van Doorn Date: Sun, 23 Jun 2019 17:10:20 -0700 Subject: Calculate working time --- core.c | 36 ++++++++++++++++++++++++++++++------ core.h | 2 ++ core.test.c | 23 +++++++++++++++++++++++ 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/core.c b/core.c index 43ec1b0..18b1925 100644 --- a/core.c +++ b/core.c @@ -52,23 +52,47 @@ void gitrolex_parseArgs(struct State_t *s, int argc, const char *argv[]) { replaceChar(s->taskArgs, '$', '-'); } +// TODO return a message/status such that we can test this +// (printing directly to the screen makes this hard) enum Error_t gitrolex_status(struct State_t *s) { enum DatabaseError_t r; char msg[512]; int size = 2048; struct TimeEnty_t entries[2048]; r = database_getEntries(s->taskArgs, entries, &size); - if(r != OK) { - printError("Ya blew it"); + if(r != OK || size <= 0) { + printError("Failed to read from db"); + return OK; + } + else if (size == 1) { + sprintf(msg, "Starting %s", s->taskArgs); + } + else { + long workingTime = gitrolex_calculateWorkingTime(entries, size); + sprintf(msg, "You've been working on %s for %ld seconds", s->taskArgs, workingTime); } - struct TimeEnty_t *start = entries; - struct TimeEnty_t *end = &entries[size - 1]; - long diff = end->datetime - start->datetime; - sprintf(msg, "You've been working on %s for %ld seconds", s->taskArgs, diff); printInfo(msg); return OK; } +long gitrolex_calculateWorkingTime(struct TimeEnty_t *t, int size) { + if (size < 2) return -1; + long sum; + sum = 0; + for(int i = 0; i < size - 1; i += 2) { + struct TimeEnty_t *start = &t[i]; + struct TimeEnty_t *end = &t[i + 1]; + // we should always be taking the diff + // between a checkout "e.g working on it" and a + // check in "e.eg finishing work" + if(start->direction != OUT || end->direction != IN) { + return -1; + } + sum += end->datetime - start->datetime; + } + return sum; +} + enum Error_t pushNow(struct State_t *s, bool direction) { enum DatabaseError_t r; struct TimeEnty_t entry = { diff --git a/core.h b/core.h index b75b022..83b8486 100644 --- a/core.h +++ b/core.h @@ -4,6 +4,7 @@ #include #include #include +#include "database.h" int gitrolex_core(); @@ -27,5 +28,6 @@ enum Error_t { }; void gitrolex_parseArgs(struct State_t *s, int argc, const char *argv[]); +long gitrolex_calculateWorkingTime(struct TimeEnty_t *t, int size); #endif diff --git a/core.test.c b/core.test.c index 3a197c8..3e9a327 100644 --- a/core.test.c +++ b/core.test.c @@ -42,7 +42,30 @@ fail: return -1; } +int calculateWorkingTimeTest() { + int size; + long result; + size = 4; + struct TimeEnty_t input[] = { + { + .direction = OUT, .datetime = 0 + }, + { + .direction = IN, .datetime = 5 + }, + { + .direction = OUT, .datetime = 15 + }, + { + .direction = IN, .datetime = 20 + } + }; + result = gitrolex_calculateWorkingTime(input, size); + return result != 10; +} + int main() { syncTest("gitrolex_parseArgs", "Failed to parse command line arguments", parseArgsTest); + syncTest("gitrolex_calculateWorkingTime", "Failed to calculate working time", calculateWorkingTimeTest); database_test(); } -- cgit v1.2.3