forked from Return-To-The-Roots/libutil
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtestFilefuncs.cpp
More file actions
143 lines (129 loc) · 5.71 KB
/
Copy pathtestFilefuncs.cpp
File metadata and controls
143 lines (129 loc) · 5.71 KB
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Copyright (C) 2005 - 2026 Settlers Freaks (sf-team at siedler25.org)
//
// SPDX-License-Identifier: GPL-2.0-or-later
#include "s25util/fileFuncs.h"
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE(PortableName)
{
// Should be: windows_name(name) && portable_posix_name(name) && (name is "." or "..", and the first character not a
// period or hyphen) windows_name: !name.empty() && (name is "." or ".." or does not end with a trailing space or
// period)
// The allowed characters are anything except 0x0-0x1F, '<', '>', ':', '"', '/', '\', and '|'.
// portable_posix_name: !name.empty() The allowed characters are 0-9, a-z, A-Z, '.', '_', and '-'
BOOST_TEST(makePortableName(".") == ".");
BOOST_TEST(makePortableName("..") == "..");
BOOST_TEST(makePortableName("...") == "");
BOOST_TEST(makePortableName("abc[]!$<>:\"/\\|e") == "abc___________e");
BOOST_TEST(makePortableName(".abc") == "abc");
BOOST_TEST(makePortableName("~abc") == "_abc");
BOOST_TEST(makePortableName("abc ") == "abc_");
BOOST_TEST(makePortableName("abc.") == "abc");
// Reserved names get _ appended
BOOST_TEST(makePortableName("con") == "con_");
BOOST_TEST(makePortableName("NUL") == "NUL_");
BOOST_TEST(makePortableName("com1") == "com1_");
BOOST_TEST(makePortableName("lpt9") == "lpt9_");
BOOST_TEST(makePortableName("com0") == "com0_");
BOOST_TEST(makePortableName("lpt0") == "lpt0_");
BOOST_TEST(makePortableName("prn") == "prn_");
BOOST_TEST(makePortableName("aux") == "aux_");
// Non-reserved names are unchanged
BOOST_TEST(makePortableName("null") == "null");
BOOST_TEST(makePortableName("console") == "console");
BOOST_TEST(makePortableName("com10") == "com10");
BOOST_TEST(makePortableName("lpt10") == "lpt10");
}
BOOST_AUTO_TEST_CASE(PortableFileName)
{
BOOST_TEST(makePortableFileName(".") == "");
BOOST_TEST(makePortableFileName("..") == "");
BOOST_TEST(makePortableFileName("abc[]!$.exe") == "abc____.exe");
BOOST_TEST(makePortableFileName("...abc") == "abc");
BOOST_TEST(makePortableFileName("file.ex1.ex2.ex3") == "fileex1ex2.ex3");
BOOST_TEST(makePortableFileName("file.extLONG") == "file.ext");
BOOST_TEST(makePortableFileName("file....") == "file");
}
BOOST_AUTO_TEST_CASE(PortableDirName)
{
BOOST_TEST(makePortableDirName(".") == ".");
BOOST_TEST(makePortableDirName("..") == "..");
BOOST_TEST(makePortableDirName("...") == "");
BOOST_TEST(makePortableDirName("abc[]!$.exe") == "abc____exe");
BOOST_TEST(makePortableDirName("...abc") == "abc");
BOOST_TEST(makePortableDirName("file.ex1.ex2.ex3") == "fileex1ex2ex3");
BOOST_TEST(makePortableDirName("file.extLONG") == "fileextLONG");
BOOST_TEST(makePortableDirName("file....") == "file");
}
BOOST_AUTO_TEST_CASE(ValidFileNameChar)
{
// Allowed
BOOST_TEST(isValidFileNameChar('a'));
BOOST_TEST(isValidFileNameChar('Z'));
BOOST_TEST(isValidFileNameChar('5'));
BOOST_TEST(isValidFileNameChar(' '));
BOOST_TEST(isValidFileNameChar('.'));
BOOST_TEST(isValidFileNameChar('_'));
BOOST_TEST(isValidFileNameChar('-'));
BOOST_TEST(isValidFileNameChar('('));
BOOST_TEST(isValidFileNameChar(')'));
BOOST_TEST(isValidFileNameChar('['));
BOOST_TEST(isValidFileNameChar(']'));
BOOST_TEST(isValidFileNameChar(U'\u00E9')); // U+00E9 e with acute
// Rejected — Windows-forbidden
BOOST_TEST(!isValidFileNameChar('<'));
BOOST_TEST(!isValidFileNameChar('>'));
BOOST_TEST(!isValidFileNameChar(':'));
BOOST_TEST(!isValidFileNameChar('"'));
BOOST_TEST(!isValidFileNameChar('/'));
BOOST_TEST(!isValidFileNameChar('\\'));
BOOST_TEST(!isValidFileNameChar('|'));
BOOST_TEST(!isValidFileNameChar('?'));
BOOST_TEST(!isValidFileNameChar('*'));
// Rejected — control characters
BOOST_TEST(!isValidFileNameChar('\0'));
BOOST_TEST(!isValidFileNameChar('\n'));
BOOST_TEST(!isValidFileNameChar(0x1F));
}
BOOST_AUTO_TEST_CASE(ValidFileName)
{
// Valid names
BOOST_TEST(isValidFileName("my save"));
BOOST_TEST(isValidFileName("Brick economy test"));
BOOST_TEST(isValidFileName("DevMap (Auto-Save)"));
BOOST_TEST(isValidFileName("save_01"));
BOOST_TEST(isValidFileName("abc"));
// Empty
BOOST_TEST(!isValidFileName(""));
// Reserved names (case-insensitive)
BOOST_TEST(!isValidFileName("con"));
BOOST_TEST(!isValidFileName("CON"));
BOOST_TEST(!isValidFileName("nul"));
BOOST_TEST(!isValidFileName("NUL"));
BOOST_TEST(!isValidFileName("com1"));
BOOST_TEST(!isValidFileName("COM9"));
BOOST_TEST(!isValidFileName("com0"));
BOOST_TEST(!isValidFileName("lpt0"));
BOOST_TEST(!isValidFileName("lpt9"));
BOOST_TEST(!isValidFileName("prn"));
BOOST_TEST(!isValidFileName("aux"));
// Non-reserved names that look similar
BOOST_TEST(isValidFileName("null"));
BOOST_TEST(isValidFileName("console"));
BOOST_TEST(isValidFileName("com10"));
BOOST_TEST(isValidFileName("lpt10"));
// Leading/trailing dots
BOOST_TEST(!isValidFileName(".hidden"));
BOOST_TEST(!isValidFileName("trail."));
// Trailing space (Windows silently strips it, causing name mismatch)
BOOST_TEST(!isValidFileName("trail "));
// Reserved base names with extensions are also rejected (Windows 7 compatibility)
BOOST_TEST(!isValidFileName("nul.ini"));
BOOST_TEST(!isValidFileName("NUL.ini"));
BOOST_TEST(!isValidFileName("nul.txt"));
BOOST_TEST(!isValidFileName("com0.txt"));
BOOST_TEST(!isValidFileName("lpt1.bak"));
// Non-reserved names with extensions or dots in the middle are fine
BOOST_TEST(isValidFileName("null.ini"));
BOOST_TEST(isValidFileName("my.save"));
BOOST_TEST(isValidFileName("my save"));
}