@@ -17,71 +17,55 @@ public class LoadSaveTests
17
17
// TODO: find a way to not have to hardcode a path here (but this may be impossible as it will depend on a user's PC and Loco install path)
18
18
// TODO: find a nicer (and more automated) way to check Name+Image fields, StringTable and G1Table
19
19
20
- static ( ILocoObject , T ) LoadObject < T > ( string filename ) where T : ILocoStruct
21
- {
22
- filename = Path . Combine ( BaseObjDataPath , filename ) ;
23
- var fileSize = new FileInfo ( filename ) . Length ;
24
- var logger = new Logger ( ) ;
25
- var loaded = SawyerStreamReader . LoadFullObjectFromFile ( filename , logger ) ;
20
+ static ( DatFileInfo , ILocoObject , T ) LoadObject < T > ( string filename ) where T : ILocoStruct
21
+ => LoadObject < T > ( File . ReadAllBytes ( Path . Combine ( BaseObjDataPath , filename ) ) ) ;
26
22
27
- Assert . That ( loaded , Is . Not . Null ) ;
28
- var ( datFileInfo , locoObject ) = loaded . Value ;
29
-
30
- Assert . Multiple ( ( ) =>
31
- {
32
- Assert . That ( datFileInfo . S5Header . Checksum , Is . EqualTo ( OriginalObjectFiles . Names [ datFileInfo . S5Header . Name ] . SteamChecksum ) ) ;
33
- Assert . That ( locoObject , Is . Not . Null ) ;
34
- Assert . That ( datFileInfo ! . ObjectHeader . DataLength , Is . EqualTo ( fileSize - S5Header . StructLength - ObjectHeader . StructLength ) , "ObjectHeader.Length didn't match actual size of struct" ) ;
35
- } ) ;
36
-
37
- return ( locoObject ! , ( T ) locoObject ! . Object ) ;
38
- }
39
-
40
- static ( ILocoObject , T ) LoadObject < T > ( ReadOnlySpan < byte > data ) where T : ILocoStruct
23
+ static ( DatFileInfo , ILocoObject , T ) LoadObject < T > ( ReadOnlySpan < byte > data ) where T : ILocoStruct
41
24
{
42
25
var logger = new Logger ( ) ;
43
- var ( datFileInfo , locoObject ) = SawyerStreamReader . LoadFullObjectFromStream ( data , logger : logger ) ;
26
+ var ( datFileInfo , locoObject ) = SawyerStreamReader . LoadFullObjectFromStream ( data , logger ) ;
44
27
45
28
#pragma warning disable IDE0079 // Remove unnecessary suppression
46
29
#pragma warning disable NUnit2045 // Use Assert.Multiple - cannot use a ReadOnlySpan inside an anonymous method
30
+ Assert . That ( datFileInfo . S5Header . Checksum , Is . EqualTo ( OriginalObjectFiles . Names [ datFileInfo . S5Header . Name ] . SteamChecksum ) ) ;
47
31
Assert . That ( locoObject , Is . Not . Null ) ;
48
32
#pragma warning restore NUnit2045 // Use Assert.Multiple
49
33
#pragma warning restore IDE0079 // Remove unnecessary suppression
50
34
Assert . That ( datFileInfo . ObjectHeader . DataLength , Is . EqualTo ( data . Length - S5Header . StructLength - ObjectHeader . StructLength ) , "ObjectHeader.Length didn't match actual size of struct" ) ;
51
35
52
- return ( locoObject ! , ( T ) locoObject ! . Object ) ;
36
+ return ( datFileInfo , locoObject ! , ( T ) locoObject ! . Object ) ;
53
37
}
54
38
55
39
static void LoadSaveGenericTest < T > ( string filename , Action < ILocoObject , T > assertFunc ) where T : ILocoStruct
56
40
{
57
- var ( obj1 , struc1 ) = LoadObject < T > ( filename ) ;
41
+ var ( datInfo1 , obj1 , struc1 ) = LoadObject < T > ( filename ) ;
58
42
assertFunc ( obj1 , struc1 ) ;
59
43
60
44
var logger = new Logger ( ) ;
61
45
var objectName = filename . Split ( '.' ) [ 0 ] ;
62
- var bytes1 = SawyerStreamWriter . WriteLocoObject ( objectName , SourceGame . Vanilla , logger , obj1 , false ) ;
46
+ var bytes1 = SawyerStreamWriter . WriteLocoObject ( objectName , SourceGame . Vanilla , datInfo1 . ObjectHeader . Encoding , logger , obj1 , false ) ;
63
47
64
- var ( obj2 , struc2 ) = LoadObject < T > ( bytes1 ) ;
48
+ var ( datInfo2 , obj2 , struc2 ) = LoadObject < T > ( bytes1 ) ;
65
49
assertFunc ( obj2 , struc2 ) ;
66
50
67
- var bytes2 = SawyerStreamWriter . WriteLocoObject ( objectName , SourceGame . Vanilla , logger , obj2 , false ) ;
51
+ var bytes2 = SawyerStreamWriter . WriteLocoObject ( objectName , SourceGame . Vanilla , datInfo2 . ObjectHeader . Encoding , logger , obj2 , false ) ;
68
52
69
53
// we could just simply compare byte arrays and be done, but i wanted something that makes it easier to diagnose problems
70
54
71
55
// grab headers first
72
56
var s5Header1 = S5Header . Read ( bytes1 [ 0 ..S5Header . StructLength ] ) ;
73
57
var s5Header2 = S5Header . Read ( bytes2 [ 0 ..S5Header . StructLength ] ) ;
58
+ AssertS5Headers ( s5Header1 , s5Header2 ) ;
74
59
75
60
var objHeader1 = ObjectHeader . Read ( bytes1 [ S5Header . StructLength ..( S5Header . StructLength + ObjectHeader . StructLength ) ] ) ;
76
61
var objHeader2 = ObjectHeader . Read ( bytes2 [ S5Header . StructLength ..( S5Header . StructLength + ObjectHeader . StructLength ) ] ) ;
62
+ AssertObjHeaders ( objHeader1 , objHeader2 ) ;
77
63
78
64
// then grab object bytes
79
65
var bytes1ObjArr = bytes1 [ 21 ..] . ToArray ( ) ;
80
66
var bytes2ObjArr = bytes2 [ 21 ..] . ToArray ( ) ;
81
-
82
- AssertS5Headers ( s5Header1 , s5Header2 ) ;
83
- AssertObjHeaders ( objHeader1 , objHeader2 ) ;
84
67
Assert . That ( bytes1ObjArr . ToArray ( ) , Is . EqualTo ( bytes2ObjArr . ToArray ( ) ) ) ;
68
+
85
69
}
86
70
87
71
static void AssertS5Headers ( S5Header expected , S5Header actual )
@@ -99,6 +83,36 @@ static void AssertObjHeaders(ObjectHeader expected, ObjectHeader actual)
99
83
Assert . That ( actual . DataLength , Is . EqualTo ( expected . DataLength ) ) ;
100
84
} ) ;
101
85
86
+ [ TestCase ]
87
+ public void TestEncoding ( )
88
+ {
89
+ var logger = new Logger ( ) ;
90
+
91
+ //var filename = "OGFOWL.dat";
92
+ //var path = "C:\\Users\\bigba\\source\\repos\\OpenLoco\\OpenGraphics\\objects\\Vehicle\\Train\\4F";
93
+ //var fullData = File.ReadAllBytes(Path.Combine(path, filename));
94
+
95
+ var filename = "707.dat" ;
96
+ var fullData = File . ReadAllBytes ( Path . Combine ( BaseObjDataPath , filename ) ) ;
97
+
98
+ if ( ! SawyerStreamReader . TryGetHeadersFromBytes ( fullData , out var hdrs , logger ) )
99
+ {
100
+ Assert . Fail ( ) ;
101
+ return ;
102
+ }
103
+
104
+ var remainingData = fullData [ ( S5Header . StructLength + ObjectHeader . StructLength ) ..] ;
105
+
106
+ var decoded = SawyerStreamReader . Decode ( hdrs . Obj . Encoding , remainingData ) ;
107
+ var encoded = SawyerStreamWriter . Encode ( hdrs . Obj . Encoding , decoded ) ;
108
+ var decoded2 = SawyerStreamReader . Decode ( hdrs . Obj . Encoding , encoded ) ;
109
+ var encoded2 = SawyerStreamWriter . Encode ( hdrs . Obj . Encoding , decoded2 ) ;
110
+
111
+ Assert . That ( remainingData , Is . EqualTo ( encoded ) ) ;
112
+ Assert . That ( decoded , Is . EqualTo ( decoded2 ) ) ;
113
+ Assert . That ( encoded , Is . EqualTo ( encoded2 ) ) ;
114
+ }
115
+
102
116
[ TestCase ( "AIRPORT1.DAT" ) ]
103
117
public void AirportObject ( string objectName )
104
118
{
@@ -656,7 +670,7 @@ void assertFunc(ILocoObject obj, RoadStationObject struc) => Assert.Multiple(()
656
670
Assert . That ( struc . NumCompatible , Is . EqualTo ( 0 ) , nameof ( struc . NumCompatible ) ) ;
657
671
Assert . That ( struc . ObsoleteYear , Is . EqualTo ( 1945 ) , nameof ( struc . ObsoleteYear ) ) ;
658
672
Assert . That ( struc . PaintStyle , Is . EqualTo ( 0 ) , nameof ( struc . PaintStyle ) ) ;
659
- Assert . That ( struc . RoadPieces , Is . EqualTo ( 0 ) , nameof ( struc . RoadPieces ) ) ;
673
+ Assert . That ( struc . RoadPieces , Is . EqualTo ( RoadTraitFlags . None ) , nameof ( struc . RoadPieces ) ) ;
660
674
Assert . That ( struc . SellCostFactor , Is . EqualTo ( - 17 ) , nameof ( struc . SellCostFactor ) ) ;
661
675
} ) ;
662
676
LoadSaveGenericTest < RoadStationObject > ( objectName , assertFunc ) ;
0 commit comments