/* 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 "liblouis.h"
#include "resolve_table.h"

#define ASSERT(test)  \
  do {                \
    if (!(test))      \
      result = 1;     \
  } while(0)          \
    
int
main(int argc, char **argv)
{
    
  /* ====================================================================== *
   * `-- resolve_table                                                      *
   *     |-- dir_1                                                          *
   *     |   |-- dir_1.1                                                    *
   *     |   |   `-- table_1.1.1                                            *
   *     |   |-- table_1.1                                                  *
   *     |   |-- table_1.2      ------------------------------              *
   *     |   `-- table_1.3 --> | include dir_1.1/table_1.1.1 |              *
   *     |-- dir_2             `-----------------------------               *
   *     |   |-- table_2.1      ------------------                          *
   *     |   `-- table_2.2 --> | include table_1 |                          *
   *     |-- table_1           `-----------------                           *
   *     |-- table_2      ------------------                                *
   *     |-- table_3 --> | include table_2 |                                *
   *     |               `-----------------                                 *
   *     |                --------------------------                        *
   *     |-- table_4 --> | include dir_1/table_1.3 |                        *
   *     |               `-------------------------                         *
   *     |                --------------------------                        *
   *     |-- table_5 --> | include dir_2/table_2.2 |                        *
   *     |               `-------------------------                         *
   *     |                ----------------------                            *
   *     `-- table_6 --> | dir_1.1/table_1.1.1 |                            *
   *                     `---------------------                             *
   * ====================================================================== */
  
  int result = 0;

  // this test relies on being in the test dir, so that it can test
  // finding tables by relative path
  if (chdir(TEST_SRC_DIR)) return 1;

  // Full path
  setenv ("LOUIS_TABLEPATH", "", 1);
  ASSERT (lou_getTable ("tables/resolve_table/table_1"));
  
  // File name not on LOUIS_TABLEPATH
  ASSERT (!lou_getTable ("table_1"));
  
  // File name on LOUIS_TABLEPATH
  setenv ("LOUIS_TABLEPATH", "tables/resolve_table", 1);
  ASSERT (lou_getTable ("table_1"));
  
  // First is full path, second is in same directory
  setenv ("LOUIS_TABLEPATH", "", 1);
  ASSERT (lou_getTable ("tables/resolve_table/table_1,"
			"table_2"));
  
  // First is full path, second is not in same directory
  ASSERT (!lou_getTable ("tables/resolve_table/table_1,"
			 "table_1.1.1"));
  
  // Two full paths
  ASSERT (lou_getTable ("tables/resolve_table/dir_1/table_1.1,"
			"tables/resolve_table/dir_2/table_2.1"));
  
  // First is full path, second is on LOUIS_TABLEPATH, third is in same
  // directory as first
  setenv ("LOUIS_TABLEPATH", "tables/resolve_table/dir_2", 1);
  ASSERT (lou_getTable ("tables/resolve_table/dir_1/table_1.1,"
			"table_2.1,"
			"table_1.2"));
  
  // First is full path, second is in subdirectory
  setenv ("LOUIS_TABLEPATH", "", 1);
  ASSERT (lou_getTable ("tables/resolve_table/table_1,"
			"dir_1/table_1.1"));
  
  // Two file names in different directories, but both on LOUIS_TABLEPATH
  setenv ("LOUIS_TABLEPATH", "tables/resolve_table/dir_1,"
			     "tables/resolve_table/dir_2", 1);
  ASSERT (lou_getTable ("table_1.2,"
			"table_2.1"));
  
  // First is file name on LOUIS_TABLEPATH, second is full path, third is in
  // same directory as second
  setenv ("LOUIS_TABLEPATH", "tables/resolve_table", 1);
  ASSERT (!lou_getTable ("table_1,"
			 "tables/resolve_table/dir_1/table_1.1,"
			 "table_1.2"));
  
  // Full path, include table in same directory
  setenv ("LOUIS_TABLEPATH", "", 1);
  ASSERT (lou_getTable ("tables/resolve_table/table_3"));
  
  // Full path, include table in subdirectory
  ASSERT (lou_getTable ("tables/resolve_table/dir_1/table_1.3"));
  
  // Full path, include table in subdirectory, from there include table in
  // sub-subdirectory
  ASSERT (lou_getTable ("tables/resolve_table/table_4"));
  
  // Full path, include table in subdirectory, from there include table in
  // first directory
  ASSERT (!lou_getTable ("tables/resolve_table/table_5"));
  
  // Full path, include table in subdirectory, from there include table on
  // LOUIS_TABLEPATH
  setenv ("LOUIS_TABLEPATH", "tables/resolve_table", 1);
  ASSERT (lou_getTable ("tables/resolve_table/table_5"));
  
  // Full path, include table in subdirectory of LOUIS_TABLEPATH
  setenv ("LOUIS_TABLEPATH", "tables/resolve_table/dir_1", 1);
  ASSERT (lou_getTable ("tables/resolve_table/table_6"));

  lou_free();

  return result;
  
}
