11using System ;
22using System . IO ;
3+ using PG . StarWarsGame . Engine . IO ;
34using PG . StarWarsGame . Engine . Utilities ;
45using Xunit ;
56#if NETFRAMEWORK
@@ -10,34 +11,37 @@ namespace PG.StarWarsGame.Engine.FileSystem.Test.IO;
1011
1112public partial class PetroglyphFileSystemTests
1213{
14+ private static string Sep = PetroglyphFileSystem . DirectorySeparatorChar . ToString ( ) ;
15+ private static string AltSep = PetroglyphFileSystem . AltDirectorySeparatorChar . ToString ( ) ;
16+ private static string OsSep = Path . DirectorySeparatorChar . ToString ( ) ;
17+
18+ // Mirrors TestData_JoinTwoPaths, but with CombinePath semantics: a rooted second path replaces the
19+ // first entirely. Null cases are omitted because CombinePath throws on null (see the dedicated facts).
20+ public static TheoryData < string , string , string > TestData_CombineTwoPaths = new ( )
21+ {
22+ { "" , "" , "" } ,
23+ { Sep , "" , Sep } ,
24+ { AltSep , "" , AltSep } ,
25+ { "" , Sep , Sep } ,
26+ { "" , AltSep , AltSep } ,
27+ { Sep , Sep , Sep } ,
28+ { AltSep , AltSep , AltSep } ,
29+ { "a" , "" , "a" } ,
30+ { "" , "a" , "a" } ,
31+ { "a" , "a" , $ "a{ OsSep } a" } ,
32+ { $ "a{ Sep } ", "a" , $ "a{ Sep } a" } ,
33+ { "a" , $ "{ Sep } a", $ "{ Sep } a" } ,
34+ { $ "a{ Sep } ", $ "{ Sep } a", $ "{ Sep } a" } ,
35+ { "a" , $ "a{ Sep } ", $ "a{ OsSep } a{ Sep } " } ,
36+ { $ "a{ AltSep } ", "a" , $ "a{ AltSep } a" } ,
37+ { "a" , $ "{ AltSep } a", $ "{ AltSep } a" } ,
38+ { $ "a{ Sep } ", $ "{ AltSep } a", $ "{ AltSep } a" } ,
39+ { $ "a{ AltSep } ", $ "{ AltSep } a", $ "{ AltSep } a" } ,
40+ { "a" , $ "a{ AltSep } ", $ "a{ OsSep } a{ AltSep } " }
41+ } ;
42+
1343 [ Theory ]
14- #if Windows
15- [ InlineData ( "a" , "b" , "a\\ b" ) ]
16- [ InlineData ( "a/" , "b" , "a/b" ) ]
17- [ InlineData ( "a\\ " , "b" , "a\\ b" ) ]
18- [ InlineData ( "" , "b" , "b" ) ]
19- [ InlineData ( "a" , "" , "a" ) ]
20- [ InlineData ( "/" , "b" , "/b" ) ]
21- [ InlineData ( "a" , "/b" , "/b" ) ]
22- [ InlineData ( "a" , "\\ b" , "\\ b" ) ]
23- [ InlineData ( "a/b" , "c/d" , "a/b\\ c/d" ) ]
24- [ InlineData ( "a\\ b" , "c\\ d" , "a\\ b\\ c\\ d" ) ]
25- [ InlineData ( "a/b/" , "c/d" , "a/b/c/d" ) ]
26- [ InlineData ( "a\\ b\\ " , "c\\ d" , "a\\ b\\ c\\ d" ) ]
27- #else
28- [ InlineData ( "a" , "b" , "a/b" ) ]
29- [ InlineData ( "a/" , "b" , "a/b" ) ]
30- [ InlineData ( "a\\ " , "b" , "a\\ b" ) ]
31- [ InlineData ( "" , "b" , "b" ) ]
32- [ InlineData ( "a" , "" , "a" ) ]
33- [ InlineData ( "/" , "b" , "/b" ) ]
34- [ InlineData ( "a" , "/b" , "/b" ) ]
35- [ InlineData ( "a" , "\\ b" , "\\ b" ) ]
36- [ InlineData ( "a/b" , "c/d" , "a/b/c/d" ) ]
37- [ InlineData ( "a\\ b" , "c\\ d" , "a\\ b/c\\ d" ) ]
38- [ InlineData ( "a/b/" , "c/d" , "a/b/c/d" ) ]
39- [ InlineData ( "a\\ b\\ " , "c\\ d" , "a\\ b\\ c\\ d" ) ]
40- #endif
44+ [ MemberData ( nameof ( TestData_CombineTwoPaths ) ) ]
4145 public void CombinePath ( string pathA , string pathB , string expected )
4246 {
4347 var result = _pgFileSystem . CombinePath ( pathA , pathB ) ;
@@ -47,31 +51,35 @@ public void CombinePath(string pathA, string pathB, string expected)
4751#endif
4852 }
4953
54+ public static TheoryData < string ? , string ? , string > TestData_JoinTwoPaths = new ( )
55+ {
56+ { "" , "" , "" } ,
57+ { Sep , "" , Sep } ,
58+ { AltSep , "" , AltSep } ,
59+ { "" , Sep , Sep } ,
60+ { "" , AltSep , AltSep } ,
61+ { Sep , Sep , $ "{ Sep } { Sep } " } ,
62+ { AltSep , AltSep , $ "{ AltSep } { AltSep } " } ,
63+ { "a" , "" , "a" } ,
64+ { "" , "a" , "a" } ,
65+ { "a" , "a" , $ "a{ OsSep } a" } ,
66+ { $ "a{ Sep } ", "a" , $ "a{ Sep } a" } ,
67+ { "a" , $ "{ Sep } a", $ "a{ Sep } a" } ,
68+ { $ "a{ Sep } ", $ "{ Sep } a", $ "a{ Sep } { Sep } a" } ,
69+ { "a" , $ "a{ Sep } ", $ "a{ OsSep } a{ Sep } " } ,
70+ { $ "a{ AltSep } ", "a" , $ "a{ AltSep } a" } ,
71+ { "a" , $ "{ AltSep } a", $ "a{ AltSep } a" } ,
72+ { $ "a{ Sep } ", $ "{ AltSep } a", $ "a{ Sep } { AltSep } a" } ,
73+ { $ "a{ AltSep } ", $ "{ AltSep } a", $ "a{ AltSep } { AltSep } a" } ,
74+ { "a" , $ "a{ AltSep } ", $ "a{ OsSep } a{ AltSep } " } ,
75+ { null , null , "" } ,
76+ { null , "a" , "a" } ,
77+ { "a" , null , "a" }
78+ } ;
79+
5080 [ Theory ]
51- #if Windows
52- [ InlineData ( "a" , "b" , "a\\ b" ) ]
53- [ InlineData ( "a/" , "b" , "a/b" ) ]
54- [ InlineData ( "a\\ " , "b" , "a\\ b" ) ]
55- [ InlineData ( "" , "b" , "b" ) ]
56- [ InlineData ( "a" , "" , "a" ) ]
57- [ InlineData ( "/" , "b" , "/b" ) ]
58- [ InlineData ( "a" , "/b" , "a/b" ) ]
59- [ InlineData ( "a" , "\\ b" , "a\\ b" ) ]
60- [ InlineData ( "a/b" , "c/d" , "a/b\\ c/d" ) ]
61- [ InlineData ( "a\\ b" , "c\\ d" , "a\\ b\\ c\\ d" ) ]
62- #else
63- [ InlineData ( "a" , "b" , "a/b" ) ]
64- [ InlineData ( "a/" , "b" , "a/b" ) ]
65- [ InlineData ( "a\\ " , "b" , "a\\ b" ) ]
66- [ InlineData ( "" , "b" , "b" ) ]
67- [ InlineData ( "a" , "" , "a" ) ]
68- [ InlineData ( "/" , "b" , "/b" ) ]
69- [ InlineData ( "a" , "/b" , "a/b" ) ]
70- [ InlineData ( "a" , "\\ b" , "a\\ b" ) ]
71- [ InlineData ( "a/b" , "c/d" , "a/b/c/d" ) ]
72- [ InlineData ( "a\\ b" , "c\\ d" , "a\\ b/c\\ d" ) ]
73- #endif
74- public void JoinPath ( string path1 , string path2 , string expected )
81+ [ MemberData ( nameof ( TestData_JoinTwoPaths ) ) ]
82+ public void JoinPath ( string ? path1 , string ? path2 , string expected )
7583 {
7684 var vsb = new ValueStringBuilder ( ) ;
7785 try
@@ -89,6 +97,54 @@ public void JoinPath(string path1, string path2, string expected)
8997 }
9098 }
9199
100+ public static TheoryData < string ? , string ? , string ? , string > TestData_JoinThreePaths = new ( )
101+ {
102+ { "" , "" , "" , "" } ,
103+ { Sep , Sep , Sep , $ "{ Sep } { Sep } { Sep } " } ,
104+ { AltSep , AltSep , AltSep , $ "{ AltSep } { AltSep } { AltSep } " } ,
105+ { "a" , "" , "" , "a" } ,
106+ { "" , "a" , "" , "a" } ,
107+ { "" , "" , "a" , "a" } ,
108+ { "a" , "" , "a" , $ "a{ OsSep } a" } ,
109+ { "a" , "a" , "" , $ "a{ OsSep } a" } ,
110+ { "" , "a" , "a" , $ "a{ OsSep } a" } ,
111+ { "a" , "a" , "a" , $ "a{ OsSep } a{ OsSep } a" } ,
112+ { "a" , Sep , "a" , $ "a{ Sep } a" } ,
113+ { $ "a{ Sep } ", "" , "a" , $ "a{ Sep } a" } ,
114+ { $ "a{ Sep } ", "a" , "" , $ "a{ Sep } a" } ,
115+ { "" , $ "a{ Sep } ", "a" , $ "a{ Sep } a" } ,
116+ { "a" , "" , $ "{ Sep } a", $ "a{ Sep } a" } ,
117+ { $ "a{ AltSep } ", "" , "a" , $ "a{ AltSep } a" } ,
118+ { $ "a{ AltSep } ", "a" , "" , $ "a{ AltSep } a" } ,
119+ { "" , $ "a{ AltSep } ", "a" , $ "a{ AltSep } a" } ,
120+ { "a" , "" , $ "{ AltSep } a", $ "a{ AltSep } a" } ,
121+ { null , null , null , "" } ,
122+ { "a" , null , null , "a" } ,
123+ { null , "a" , null , "a" } ,
124+ { null , null , "a" , "a" } ,
125+ { "a" , null , "a" , $ "a{ OsSep } a" }
126+ } ;
127+
128+ [ Theory ]
129+ [ MemberData ( nameof ( TestData_JoinThreePaths ) ) ]
130+ public void JoinPath_ThreePaths ( string ? path1 , string ? path2 , string ? path3 , string expected )
131+ {
132+ var vsb = new ValueStringBuilder ( ) ;
133+ try
134+ {
135+ _pgFileSystem . JoinPath ( path1 . AsSpan ( ) , path2 . AsSpan ( ) , path3 . AsSpan ( ) , ref vsb ) ;
136+ var result = vsb . ToString ( ) ;
137+ Assert . Equal ( expected , result ) ;
138+ #if Windows
139+ Assert . Equal ( result , _fileSystem . Path . Join ( path1 , path2 , path3 ) ) ;
140+ #endif
141+ }
142+ finally
143+ {
144+ vsb . Dispose ( ) ;
145+ }
146+ }
147+
92148 [ Fact ]
93149 public void CombinePath_FirstArgNull_Throws ( )
94150 {
0 commit comments