#include "Config.h"

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <limits.h>
#include <stdarg.h>

#include "Bootstrap.h"
#include "Str.h"
#include "File.h"

/**
 * File.c unity tests.
 */


int main(void) {
        char path[STRLEN];

        Bootstrap(); // Need to initialize library
        
        printf("============> Start File Tests\n\n");
        
        snprintf(path, STRLEN, "/tmp/.FileTest.%d", getpid());
        
        printf("=> Test1: open/close\n");
        {
                int fd;
                assert((fd = File_open(path, "w")) != -1);
                assert(File_close(fd) == true);
                assert((fd = File_open(path, "w+")) != -1);
                assert(File_close(fd) == true);
                assert((fd = File_open("/a/b/c/d", "r")) == -1);
                assert((fd = File_open(path, "r")) != -1);
                assert(File_close(fd) == true);
                assert((fd = File_open(path, "r+")) != -1);
                assert(File_close(fd) == true);
                assert((fd = File_open(path, "a")) != -1);
                assert(File_close(fd) == true);
                assert((fd = File_open(path, "a+")) != -1);
                assert(write(fd, "something", sizeof("something") - 1) > 0);
                assert(File_close(fd) == true);
        }
        printf("=> Test1: OK\n\n");

        printf("=> Test2: check properties (class)\n");
        {
                char c;
                int i;
                long j;
                long long k;
                struct stat s;
                assert(stat(path, &s) == 0);
                assert((j = File_mtime(path)) > 0);
                printf("\tmodification time: %ld\n", j);
                assert(j == s.st_mtime);
                assert((j = File_ctime(path)) > 0);
                printf("\tchange time: %ld\n", j);
                assert(j == s.st_ctime);
                assert((j = File_atime(path)) > 0);
                printf("\taccess time: %ld\n", j);
                assert(j == s.st_atime);
                assert((k = File_size(path)) >= 0);
                printf("\tsize: %lld B\n", k);
                assert(k == s.st_size);
                assert((c = File_isFile(path)) == true);
                assert((c = File_type(path)) == 'r');
                printf("\ttype: regular file\n");
                assert((File_exist(path)) == true);
                printf("\texist: yes\n");
                assert((i = File_mod(path)) > 0);
                printf("\tpermission mode: %o\n", i & 07777);
                assert(i == s.st_mode);
                assert(File_chmod(path, 00640) == true);
                assert((File_mod(path) & 07777) == 00640);
                assert(File_isReadable(path) == true);
                assert(File_isWritable(path) == true);
#if defined(SOLARIS) || defined (FREEBSD) || defined (AIX)
                /* Some systems like Solaris and FreeBSD return X_OK if the process has
                 * appropriate privilege even if none of the execute file permission bits
                 * are set. */
                if (getuid() == 0)
                        assert(File_isExecutable(path) == true);
                else
#endif
                assert(File_isExecutable(path) == false);
        }
        printf("=> Test2: OK\n\n");

        printf("=> Test3: check directory\n");
        {
                assert(File_isDirectory("/") == true);
                assert(File_type("/") == 'd');
                assert(File_isDirectory(path) == false);
        }
        printf("=> Test3: OK\n\n");

        printf("=> Test4: check umask\n");
        {
                int i;
                assert((i = File_umask()) >= 0);
                printf("\tumask: %o\n", i & 07777);
                assert(File_setUmask(0002) == i);
                assert(File_setUmask(i) == 0002);
        }
        printf("=> Test4: OK\n\n");

        printf("=> Test5: rename\n");
        {
                File_rename(path, "/tmp/.FileTest.abcde");
                snprintf(path, STRLEN, "/tmp/.FileTest.abcde"); // the file is kept for later tests
        }
        printf("=> Test5: OK\n\n");

        printf("=> Test6: path parsing\n");
        {
                char s[STRLEN];
                assert(Str_isEqual(File_basename(path), ".FileTest.abcde"));
                snprintf(s, STRLEN, "%s", path);
                assert(Str_isEqual(File_dirname(s), "/tmp/"));
                assert(Str_isEqual(File_extension(path), "abcde"));
                char dir_path[] = "/tmp/";
                assert(Str_isEqual(File_removeTrailingSeparator(dir_path), "/tmp"));
        }
        printf("=> Test6: OK\n\n");

        printf("=> Test7: normalize path\n");
        {
                char s[PATH_MAX];
                assert(File_getRealPath("/././tmp/../tmp", s) != NULL);
#ifdef DARWIN
                /* On Darwin /tmp is a link to /private/tmp */
                assert(Str_isEqual(s, "/private/tmp")); 
#else
                assert(Str_isEqual(s, "/tmp"));
#endif
        }
        printf("=> Test7: OK\n\n");

        printf("=> Test8: delete\n");
        {
                assert(File_delete(path) == true);
                assert(File_exist(path) == false);
        }
        printf("=> Test8: OK\n\n");
        
        printf("=> Test9: removeTrailingSeparator\n");
        {
                char a[] = "/abc/def/";
                char b[] = "/abc/def";
                assert(Str_isEqual(File_removeTrailingSeparator(a), "/abc/def"));
                assert(Str_isEqual(File_removeTrailingSeparator(b), "/abc/def"));
                assert(Str_isEqual(File_removeTrailingSeparator(""), ""));
                assert(File_removeTrailingSeparator(NULL) == NULL);
        }
        printf("=> Test9: OK\n\n");
        
        printf("============> File Tests: OK\n\n");

        return 0;
}


