/* liblouis Braille Translation and Back-Translation Library

Copyright (C) 2014 Swiss Library for the Blind, Visually Impaired and Print Disabled

Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without any warranty. */

#include <config.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "internal.h"

static char log_buffer[1024];
static int log_buffer_pos = 0;

static void
log_to_buffer(logLevels level, const char *message)
{
  switch(level) {
    case LOU_LOG_DEBUG:
      log_buffer_pos += sprintf(&log_buffer[log_buffer_pos], "[DEBUG] %s\n", message);
      break;
    case LOU_LOG_INFO:
      log_buffer_pos += sprintf(&log_buffer[log_buffer_pos], "[INFO] %s\n", message);
      break;
    case LOU_LOG_WARN:
      log_buffer_pos += sprintf(&log_buffer[log_buffer_pos], "[WARN] %s\n", message);
      break;
    case LOU_LOG_ERROR:
      log_buffer_pos += sprintf(&log_buffer[log_buffer_pos], "[ERROR] %s\n", message);
      break;
    case LOU_LOG_FATAL:
      log_buffer_pos += sprintf(&log_buffer[log_buffer_pos], "[FATAL] %s\n", message);
      break;  
  }
}

static int
assert_string_equals(char * expected, char * actual)
{
  if (strcmp(expected, actual))
    {
      printf("Expected \"%s\" but received \"%s\"\n", expected, actual);
      return 1;
    }
  return 0;
}
  
static int
assert_log_buffer_equals(char * expected)
{
  return assert_string_equals(expected, log_buffer);
}

int
main(int argc, char **argv)
{
  lou_registerLogCallback(log_to_buffer);
  log_buffer_pos = 0;
  lou_setLogLevel(LOU_LOG_WARN);
  _lou_logMessage(LOU_LOG_ERROR, "foo");
  _lou_logMessage(LOU_LOG_INFO, "bar");
  lou_setLogLevel(LOU_LOG_INFO);
  _lou_logMessage(LOU_LOG_INFO, "baz");
  return assert_log_buffer_equals("[ERROR] foo\n[INFO] baz\n");
}
