summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Van Doorn <vandoorn.nick@gmail.com>2019-06-23 17:10:20 -0700
committerNick Van Doorn <vandoorn.nick@gmail.com>2019-06-23 17:10:20 -0700
commit9360e26b46ec0bfb4eca5f8386b94805ae188e3c (patch)
tree69d3ed9aa5928b588771f769a1f6a84b7ce69088
parentb0837d2877fac69382293cc7f31d35375423f070 (diff)
Calculate working time
-rw-r--r--core.c36
-rw-r--r--core.h2
-rw-r--r--core.test.c23
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 <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
+#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();
}