Echo Writes Code

test_filesystem.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "crucible/core.hpp"
#include "crucible/test.hpp"

namespace crucible::core
{
  constexpr String_View PARENT_DIRECTORY { "test_filesystem_scratch_directory" };

  constexpr String_View NONEXISTENT_DIRECTORY { "this/directory/definitely/does/not/exist" };

  constexpr String_View NONEXISTENT_FILE { "this/file/definitely/does/not/exist.txt" };

  constexpr String_View TEST_DIRECTORY { "test_directory" };

  constexpr String_View TEST_FILE { "test_file.txt" };

  constexpr String_View TEST_FILE_TEXT { "foo\nbar\nbaz\n" };

  CRUCIBLE_TEST_BEFORE_EACH(create_file_structure)
  {
    try_delete_directory_recursive(PARENT_DIRECTORY)
      .discard();

    {
      auto const result { try_create_directory(PARENT_DIRECTORY) };
      CRUCIBLE_CORE_ASSERT_SUCCESS(result);
    }

    {
      auto const result { try_create_text_file(PARENT_DIRECTORY + "/" + TEST_FILE, TEST_FILE_TEXT) };
      CRUCIBLE_CORE_ASSERT_SUCCESS(result);
    }

    {
      auto const result { try_create_directory(PARENT_DIRECTORY + "/" + TEST_DIRECTORY) };
      CRUCIBLE_CORE_ASSERT_SUCCESS(result);
    }

    {
      auto const result { try_create_text_file(PARENT_DIRECTORY + "/" + TEST_DIRECTORY + "/" + TEST_FILE, TEST_FILE_TEXT) };
      CRUCIBLE_CORE_ASSERT_SUCCESS(result);
    }
  }

  CRUCIBLE_TEST_AFTER_EACH(delete_file_structure)
  {
    try_delete_directory_recursive(PARENT_DIRECTORY)
      .discard();
  }

  CRUCIBLE_TEST_SCENARIO(create_directory_in_nonexistent_directory_fails)
  {
    auto const result { try_create_directory(PARENT_DIRECTORY + "/" + NONEXISTENT_DIRECTORY) };
    CRUCIBLE_CORE_ASSERT_FAILURE(result);
  }

  CRUCIBLE_TEST_SCENARIO(create_directory_fails_if_exists)
  {
    auto const result { try_create_directory(PARENT_DIRECTORY + "/" + TEST_DIRECTORY) };
    CRUCIBLE_CORE_ASSERT_FAILURE(result);
  }

  CRUCIBLE_TEST_SCENARIO(create_file_in_nonexistent_directory_fails)
  {
    auto const result { try_create_text_file(PARENT_DIRECTORY + "/" + NONEXISTENT_FILE, TEST_FILE_TEXT) };
    CRUCIBLE_CORE_ASSERT_FAILURE(result);
  }

  CRUCIBLE_TEST_SCENARIO(create_file_fails_if_exists)
  {
    auto const result { try_create_text_file(PARENT_DIRECTORY + "/" + TEST_FILE, TEST_FILE_TEXT) };
    CRUCIBLE_CORE_ASSERT_FAILURE(result);
  }

  CRUCIBLE_TEST_SCENARIO(delete_nonexistent_directory_fails)
  {
    auto const result { try_delete_directory(PARENT_DIRECTORY + "/" + NONEXISTENT_DIRECTORY) };
    CRUCIBLE_CORE_ASSERT_FAILURE(result);
  }

  CRUCIBLE_TEST_SCENARIO(delete_nonexistent_file_fails)
  {
    auto const result { try_delete_file(PARENT_DIRECTORY + "/" + NONEXISTENT_FILE) };
    CRUCIBLE_CORE_ASSERT_FAILURE(result);
  }

  CRUCIBLE_TEST_SCENARIO(read_nonexistent_directory_fails)
  {
    auto const result { try_read_directory_list(PARENT_DIRECTORY + "/" + NONEXISTENT_DIRECTORY) };
    CRUCIBLE_CORE_ASSERT_FAILURE(result);
  }

  CRUCIBLE_TEST_SCENARIO(read_nonexistent_file_fails)
  {
    auto const result { try_read_text_file(PARENT_DIRECTORY + "/" + NONEXISTENT_FILE) };
    CRUCIBLE_CORE_ASSERT_FAILURE(result);
  }

  CRUCIBLE_TEST_SCENARIO(read_directory_list)
  {
    auto const result { try_read_directory_list(PARENT_DIRECTORY + "/" + TEST_DIRECTORY) };
    CRUCIBLE_CORE_ASSERT_SUCCESS(result);

    auto const &directory_listing { result.success() };
    CRUCIBLE_CORE_ASSERT_EQ(directory_listing.size(), 1);
    CRUCIBLE_CORE_ASSERT_EQ(directory_listing[0].name, TEST_FILE);
  }

  CRUCIBLE_TEST_SCENARIO(read_file_text)
  {
    auto const result { try_read_text_file(PARENT_DIRECTORY + "/" + TEST_FILE) };
    CRUCIBLE_CORE_ASSERT_SUCCESS(result);

    auto const &data_from_disk { result.success() };
    CRUCIBLE_CORE_ASSERT_EQ(TEST_FILE_TEXT, data_from_disk);
  }

  CRUCIBLE_TEST_SCENARIO(read_file_size)
  {
    auto const result { try_read_file_size(PARENT_DIRECTORY + "/" + TEST_FILE) };
    CRUCIBLE_CORE_ASSERT_SUCCESS(result);

    auto const size_from_disk { result.success() };
    CRUCIBLE_CORE_ASSERT_EQ(size_from_disk, TEST_FILE_TEXT.size());
  }
}

CRUCIBLE_TEST_MAIN