/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * Tests for string utility functions.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "test_common.h"
#include "utility.h"
#include "vboot_common.h"


/* Test string concatenation */
static void StrncatTest(void) {
  char dest[128];

  /* Null inputs */
  TEST_EQ(0, StrnAppend(dest, NULL, sizeof(dest)), "StrnAppend('', null)");
  TEST_EQ(0, StrnAppend(NULL, "Hey!", sizeof(dest)), "StrnAppend(null, '')");

  /* Empty <-- empty */
  *dest = 0;
  TEST_EQ(0, StrnAppend(dest, "", sizeof(dest)), "StrnAppend('', '')");
  TEST_EQ(0, strcmp(dest, ""), "StrnAppend('', '') result");

  /* Nonempty <-- empty */
  strcpy(dest, "Bob");
  TEST_EQ(3, StrnAppend(dest, "", sizeof(dest)), "StrnAppend(B, '')");
  TEST_EQ(0, strcmp(dest, "Bob"), "StrnAppend(B, '') result");

  /* Empty <-- nonempty */
  *dest = 0;
  TEST_EQ(5, StrnAppend(dest, "Alice", sizeof(dest)), "StrnAppend('', A)");
  TEST_EQ(0, strcmp(dest, "Alice"), "StrnAppend('', A) result");

  /* Nonempty <-- nonempty */
  strcpy(dest, "Tigre");
  TEST_EQ(10, StrnAppend(dest, "Bunny", sizeof(dest)), "StrnAppend(T, B)");
  TEST_EQ(0, strcmp(dest, "TigreBunny"), "StrnAppend(T, B) result");

  /* Test clipping */
  strcpy(dest, "YesI");
  TEST_EQ(7, StrnAppend(dest, "Can't", 8), "StrnAppend(Y, over)");
  TEST_EQ(0, strcmp(dest, "YesICan"), "StrnAppend(Y, over) result");

  /* Test clipping if dest already overflows its claimed length */
  strcpy(dest, "BudgetDeficit");
  TEST_EQ(6, StrnAppend(dest, "Spending", 7), "StrnAppend(over, over)");
  TEST_EQ(0, strcmp(dest, "Budget"), "StrnAppend(over, over) result");
}


static void TestU64ToS(uint64_t value, uint32_t radix, uint32_t zero_pad_width,
                       const char *expect) {
  char dest[UINT64_TO_STRING_MAX];

  TEST_EQ(strlen(expect),
          Uint64ToString(dest, sizeof(dest), value, radix, zero_pad_width),
          "Uint64ToString");
  printf("Uint64ToString expect %s got %s\n", expect, dest);
  TEST_EQ(0, strcmp(dest, expect), "Uint64ToString result");
}


/* Test uint64 to string conversion */
static void Uint64ToStringTest(void) {
  char dest[UINT64_TO_STRING_MAX];

  /* Test invalid inputs */
  TEST_EQ(0, Uint64ToString(NULL, 8, 123, 10, 8), "Uint64ToString null dest");
  TestU64ToS(0, 1, 0, "");
  TestU64ToS(0, 37, 0, "");

  /* Binary */
  TestU64ToS(0, 2, 0, "0");
  TestU64ToS(0x9A, 2, 0, "10011010");
  TestU64ToS(0x71, 2, 12, "000001110001");
  TestU64ToS(
      ~UINT64_C(0), 2, 0,
      "1111111111111111111111111111111111111111111111111111111111111111");

  /* Decimal */
  TestU64ToS(0, 10, 0, "0");
  TestU64ToS(12345, 10, 0, "12345");
  TestU64ToS(67890, 10, 8, "00067890");
  TestU64ToS(~UINT64_C(0), 10, 0, "18446744073709551615");

  /* Hex */
  TestU64ToS(0, 16, 0, "0");
  TestU64ToS(0x12345678, 16, 0, "12345678");
  TestU64ToS(0x9ABCDEF, 16, 8, "09abcdef");
  TestU64ToS(~UINT64_C(0), 16, 0, "ffffffffffffffff");

  /* Zero pad corner cases */
  /* Don't pad if over length */
  TestU64ToS(UINT64_C(0x1234567890), 16, 8, "1234567890");
  /* Fail if padding won't fit in buffer */
  TEST_EQ(0, Uint64ToString(dest, 8, 123, 10, 8), "Uint64ToString bad pad");
  TEST_EQ(0, strcmp(dest, ""), "Uint64ToString bad pad result");

}


/* disable MSVC warnings on unused arguments */
__pragma(warning (disable: 4100))

int main(int argc, char* argv[]) {
  int error_code = 0;

  StrncatTest();
  Uint64ToStringTest();

  if (!gTestSuccess)
    error_code = 255;

  return error_code;
}
