Compare commits

...

121 Commits
1.6.9 ... 1.8.0

Author SHA1 Message Date
Matt Nadareski
5a3e69e8ed Bump version 2024-11-30 21:32:15 -05:00
Matt Nadareski
67ee595eb4 More clearing out of old null checks 2024-11-30 02:49:10 -05:00
Matt Nadareski
992f8eaeb8 Reduce more nullable-array-nullable 2024-11-29 22:54:36 -05:00
Matt Nadareski
dde5a57136 Fix some misconfigured framework gating 2024-11-29 22:20:46 -05:00
Matt Nadareski
ae49950ae6 Go back to Vector3D direct deserialization 2024-11-29 21:41:49 -05:00
Matt Nadareski
b56ea3a479 Remove now-unneeded guards in printers 2024-11-29 21:35:56 -05:00
Matt Nadareski
03d4ea046d Update Models and IO 2024-11-29 20:48:50 -05:00
Matt Nadareski
248741b2c0 Add one forgotten check to a test 2024-11-29 02:00:01 -05:00
Matt Nadareski
ef307664e2 Remove now-redundant real metadata files 2024-11-29 01:57:32 -05:00
Matt Nadareski
05c497a5a0 Add roundtrip serialization tests for metadata files 2024-11-29 01:54:40 -05:00
Matt Nadareski
f8239780b2 Improve OpenMSX test, add AttractMode test 2024-11-29 00:21:10 -05:00
Matt Nadareski
ff12bf8205 Add serializer boundary tests; migrate old file 2024-11-29 00:04:02 -05:00
Matt Nadareski
0c3adf055c Add wrapper tests 2024-11-28 23:22:53 -05:00
Matt Nadareski
d9b1f5d45f Fix issue found by tests 2024-11-28 23:06:09 -05:00
Matt Nadareski
5ab3dded30 Remove while true from cuesheet parsing 2024-11-28 23:00:31 -05:00
Matt Nadareski
991d9ead27 Deserializers should have their own guards 2024-11-28 22:57:12 -05:00
Matt Nadareski
25c0d036f2 Length can throw on read-forward streams 2024-11-28 22:24:37 -05:00
Matt Nadareski
c06d8151e6 Add short-circuit for 0-length arrays 2024-11-28 22:15:25 -05:00
Matt Nadareski
0e9ba25637 Add required extension property 2024-11-28 22:09:07 -05:00
Matt Nadareski
bd7ca7f3a7 CanSeek can throw on read-forward streams 2024-11-28 22:01:03 -05:00
Matt Nadareski
26146554a3 Ensure read errors don't throw on wrapper creation 2024-11-28 21:58:49 -05:00
Matt Nadareski
884746a5a1 Add more extension properties 2024-11-28 20:50:43 -05:00
Matt Nadareski
ab0e68110c Move helper classes out of Wrappers 2024-11-27 23:43:50 -05:00
Matt Nadareski
e166d18903 Add extensions based on common use 2024-11-27 22:38:05 -05:00
Matt Nadareski
2152ba43a8 Minor formatting changes in extensions 2024-11-27 22:07:48 -05:00
Matt Nadareski
f42c5d04ee Fix issues from BSP29 (unsupported) 2024-11-27 21:45:26 -05:00
Matt Nadareski
ea535fa393 Read Vector3D manually 2024-11-27 21:33:24 -05:00
Matt Nadareski
e6d118e8cc Fix build 2024-11-27 21:26:23 -05:00
Matt Nadareski
35a921e436 Update Models to 1.5.4 2024-11-27 21:22:24 -05:00
Matt Nadareski
25cc3e42f3 Do length checks in V/BSP 2024-11-27 21:05:04 -05:00
Matt Nadareski
14344756da Port all non-compression extraction from BOS 2024-11-27 20:54:13 -05:00
Matt Nadareski
cb270d3185 Fix SizeOf issue in old .NET 2024-11-27 20:37:07 -05:00
Matt Nadareski
d5cef39f1b Forgot one named entity 2024-11-27 20:31:56 -05:00
Matt Nadareski
b782af427e Move simple extraction from BOS back for V/BSP 2024-11-27 20:30:48 -05:00
Matt Nadareski
6b503a0733 Perform more deserializer cleanup 2024-11-27 20:30:31 -05:00
Matt Nadareski
4a3741312e Reduce unncessary methods in deserialization 2024-11-27 16:14:56 -05:00
Matt Nadareski
aed140a684 Be smarter with using statements in tests 2024-11-27 14:25:53 -05:00
Matt Nadareski
5b93df9703 Split old monolithic deserializer test file 2024-11-27 14:18:08 -05:00
Matt Nadareski
5ae162400c Handle unexpected deserializer results 2024-11-27 14:04:20 -05:00
Matt Nadareski
f828b57159 Perform correctness and TODO cleanup 2024-11-27 13:47:07 -05:00
Matt Nadareski
d0cfc67f07 Update Deserializers and add empty/null/invalid tests 2024-11-27 12:43:52 -05:00
Matt Nadareski
2f48c3110c Update CrossModel converters and add tests 2024-11-27 10:16:23 -05:00
Matt Nadareski
6cdc35c82f Update packages 2024-11-26 19:51:39 -05:00
Matt Nadareski
9214a22cc9 Bump version 2024-11-20 20:05:03 -05:00
Matt Nadareski
5ba1156245 Fix return comments 2024-11-20 20:02:36 -05:00
Matt Nadareski
cb91cdff1d Minor formatting quibbles 2024-11-20 20:01:28 -05:00
Matt Nadareski
4df6a4e79d Reduce use of IEnumerable where not necessary 2024-11-20 19:51:49 -05:00
Matt Nadareski
5b82a48267 Update ASN.1 to 1.4.2 2024-11-20 16:06:00 -05:00
Matt Nadareski
8f70c50a48 Trim strings and only include them if the right length 2024-11-20 15:48:12 -05:00
Matt Nadareski
5fe4d81fa4 Ensure strings are read properly 2024-11-20 15:42:24 -05:00
Matt Nadareski
7d3addbf0a Print embedded zip as embedded zip 2024-11-20 15:12:23 -05:00
Matt Nadareski
b7d5873eb7 Wrap ASN.1 call until fixed in library 2024-11-20 15:07:13 -05:00
Matt Nadareski
4e40cc19d5 TODO cleanup 2024-11-20 14:54:22 -05:00
Matt Nadareski
1bc9316bc1 Update packages 2024-11-20 14:35:37 -05:00
Matt Nadareski
c995ec1dca Miscellaneous cleanup 2024-11-19 12:40:32 -05:00
Matt Nadareski
4d2fbbae04 Update Models to 1.5.2 2024-11-19 01:04:50 -05:00
Matt Nadareski
2776928946 Bump version 2024-11-15 22:38:35 -05:00
Matt Nadareski
8cc87c6540 Recombine WrapperBase files 2024-11-15 22:26:45 -05:00
Matt Nadareski
3c212022aa Use safe enumeration 2024-11-15 22:25:28 -05:00
Matt Nadareski
511c4d09e5 Update ASN1 to 1.4.1 and IO to 1.5.1 2024-11-15 22:22:22 -05:00
Matt Nadareski
d7eba27dc5 Framework only matters for executable 2024-11-15 21:10:27 -05:00
Matt Nadareski
09370618ca Reorder some methods 2024-11-14 20:51:25 -05:00
Matt Nadareski
2197167088 Add remaining easy sizes per partition 2024-11-14 20:48:42 -05:00
Matt Nadareski
b527635fe7 Add remaining easy offsets per partition 2024-11-14 20:46:56 -05:00
Matt Nadareski
695309bc32 Bump version 2024-11-14 13:32:19 -05:00
Matt Nadareski
97b2f68ec7 Use offsets instead of guessing... 2024-11-14 13:27:02 -05:00
Matt Nadareski
593044dbf3 Fix code binary check in N3DS 2024-11-14 12:49:16 -05:00
Matt Nadareski
1fcf44fb8d Bump version 2024-11-14 11:32:17 -05:00
Matt Nadareski
a2a472baf9 Fix top level printing issue 2024-11-14 11:24:08 -05:00
Matt Nadareski
b5b4a50d94 Fix deserialization of NCCH extended header
The actual fix to this is somewhere in the conversion code where an array of Enum values somehow just... fails? I'm not totally sure how that's happening but this is the easiest way around it until that auto stuff can be fixed.
2024-11-14 11:20:46 -05:00
Matt Nadareski
f1b5464052 Extend N3DS wrapper further 2024-11-14 03:17:11 -05:00
Matt Nadareski
2c0224db22 Fix byte order for N3DS IV 2024-11-14 00:12:35 -05:00
Matt Nadareski
1e78eecb40 Bump version 2024-11-13 23:13:55 -05:00
Matt Nadareski
3626faea60 Fix building N3DS cart image 2024-11-13 23:05:26 -05:00
Matt Nadareski
a0177f1174 Add bitmasks helper method 2024-11-13 21:29:43 -05:00
Matt Nadareski
db5fe4a2cd Add extension property for backup header 2024-11-13 21:25:46 -05:00
Matt Nadareski
5716143168 Bump version 2024-11-13 20:48:55 -05:00
Matt Nadareski
2a59b23149 Add more extensions to N3DS wrapper 2024-11-13 20:47:25 -05:00
Matt Nadareski
bdbec4ed02 Update Models to 1.5.1 2024-11-13 20:41:13 -05:00
Matt Nadareski
25193f1805 Start making fixes to N3DS 2024-11-13 20:21:32 -05:00
Matt Nadareski
4840c816a2 Bump version 2024-11-13 02:51:46 -05:00
Matt Nadareski
d0a8e3770b Fix serialization issue 2024-11-13 02:48:38 -05:00
Matt Nadareski
1cf3d50864 Add .NET 9 to target frameworks 2024-11-13 02:42:14 -05:00
Matt Nadareski
d1b98f7d6d HashSet does what I need 2024-11-12 19:41:04 -05:00
Matt Nadareski
4bc87ff812 Use list sorting instead of Linq sorting 2024-11-12 19:35:08 -05:00
Matt Nadareski
e1df11b360 Build cached strings differently 2024-11-12 19:30:28 -05:00
Matt Nadareski
34606a4f04 Easier to read archive count in VPK 2024-11-12 17:05:10 -05:00
Matt Nadareski
c4c5fc4bf6 Array.Find works differently than I thought 2024-11-12 16:58:21 -05:00
Matt Nadareski
cd87ce5373 Unrolling Linq is more efficient 2024-11-12 16:44:41 -05:00
Matt Nadareski
90fc16b888 Reduce more Linq steps 2024-11-12 16:29:47 -05:00
Matt Nadareski
c2d0b71d22 Generic types all have ToString 2024-11-12 16:18:56 -05:00
Matt Nadareski
e54473682c Use TrueForAll 2024-11-12 16:11:15 -05:00
Matt Nadareski
1c8d64d98c Clean up usings 2024-11-12 16:07:31 -05:00
Matt Nadareski
a19437f42f More efficient checks 2024-11-12 16:07:27 -05:00
Matt Nadareski
855e2f2c77 Another overload I never knew about 2024-11-12 16:02:21 -05:00
Matt Nadareski
bd3cf88123 As I said, they're fun 2024-11-12 16:00:05 -05:00
Matt Nadareski
e4578ad3fc Match collections are fun 2024-11-12 15:56:31 -05:00
Matt Nadareski
39e56ef864 Remove one more unnecessary cast 2024-11-12 15:47:49 -05:00
Matt Nadareski
51b77da760 Reduce use of Cast 2024-11-12 15:46:36 -05:00
Matt Nadareski
4b83219a9b Fix conversion 2024-11-12 15:33:48 -05:00
Matt Nadareski
3ed07dd299 Linq is good, but it can be better 2024-11-12 15:30:33 -05:00
Matt Nadareski
bb7daed7f6 Reduce Linq steps 2024-11-12 15:06:28 -05:00
Matt Nadareski
0c84c47752 Explicitly add Linq library 2024-11-12 15:03:28 -05:00
Matt Nadareski
c18a185474 Fix old .NET 2024-11-12 14:56:53 -05:00
Matt Nadareski
8ff66b04d8 Reduce Linq to better query 2024-11-12 14:49:42 -05:00
Matt Nadareski
94d6556e04 Ignore additional elements 2024-11-12 14:40:43 -05:00
Matt Nadareski
6d960265e4 Minor Linq reduction 2024-11-12 14:27:34 -05:00
Matt Nadareski
cf4ca76e10 Select 2024-11-12 14:10:00 -05:00
Matt Nadareski
c7760e9903 Any 2024-11-12 13:10:47 -05:00
Matt Nadareski
d51bedceb6 ToArray 2024-11-12 13:03:06 -05:00
Matt Nadareski
125dc021d5 Disallow CRC-32 variants 2024-11-12 12:37:42 -05:00
Matt Nadareski
5bce481648 Update Hashing to 1.3.0 2024-11-12 12:36:46 -05:00
Matt Nadareski
20153f62cf Update Hashing to 1.2.3 2024-11-06 21:56:44 -05:00
Matt Nadareski
e302dfccf1 Attempt to reduce nesting in GHA builds 2024-11-05 13:53:34 -05:00
Matt Nadareski
594b841490 Make GitHub action Debug-only 2024-11-04 15:09:10 -05:00
Matt Nadareski
40c354f79f Add releases links for convenience 2024-11-04 13:17:55 -05:00
Matt Nadareski
b77959f300 Rename test executable 2024-11-04 12:14:28 -05:00
Matt Nadareski
59d6026a2b Create helper method for string reading; add UTF-8 2024-11-02 20:23:20 -04:00
Matt Nadareski
14226d1270 Completely reset cached data 2024-11-02 19:53:21 -04:00
Matt Nadareski
955f4da708 Fix minor formatting issue 2024-11-02 19:42:32 -04:00
Matt Nadareski
700b0359ea Limit fully repeating strings 2024-11-02 19:40:02 -04:00
341 changed files with 29806 additions and 648144 deletions

View File

@@ -16,10 +16,16 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build library
run: dotnet build
- name: Run tests
run: dotnet test
- name: Pack
run: dotnet pack

View File

@@ -1,4 +1,4 @@
name: Build Test
name: Build InfoPrint
on:
push:
@@ -10,10 +10,10 @@ jobs:
strategy:
matrix:
project: [Test]
runtime: [win-x86, win-x64, linux-x64, osx-x64] #[win-x86, win-x64, win-arm64, linux-x64, linux-arm64, osx-x64]
framework: [net8.0] #[net20, net35, net40, net452, net472, net48, netcoreapp3.1, net5.0, net6.0, net7.0, net8.0]
conf: [Release, Debug]
project: [InfoPrint]
runtime: [win-x86, win-x64, win-arm64, linux-x64, linux-arm64, osx-x64]
framework: [net9.0] #[net20, net35, net40, net452, net472, net48, netcoreapp3.1, net5.0, net6.0, net7.0, net8.0, net9.0]
conf: [Debug] #[Release, Debug]
steps:
- uses: actions/checkout@v4
@@ -23,16 +23,18 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet publish ${{ matrix.project }}/${{ matrix.project }}.csproj -f ${{ matrix.framework }} -r ${{ matrix.runtime }} -c ${{ matrix.conf == 'Release' && 'Release -p:DebugType=None -p:DebugSymbols=false' || 'Debug'}} --self-contained true --version-suffix ${{ github.sha }} ${{ (startsWith(matrix.framework, 'net5') || startsWith(matrix.framework, 'net6') || startsWith(matrix.framework, 'net7') || startsWith(matrix.framework, 'net8')) && '-p:PublishSingleFile=true' || ''}}
run: dotnet publish ${{ matrix.project }}/${{ matrix.project }}.csproj -f ${{ matrix.framework }} -r ${{ matrix.runtime }} -c ${{ matrix.conf == 'Release' && 'Release -p:DebugType=None -p:DebugSymbols=false' || 'Debug'}} --self-contained true --version-suffix ${{ github.sha }} ${{ (startsWith(matrix.framework, 'net5') || startsWith(matrix.framework, 'net6') || startsWith(matrix.framework, 'net7') || startsWith(matrix.framework, 'net8') || startsWith(matrix.framework, 'net9')) && '-p:PublishSingleFile=true' || ''}}
- name: Archive build
run: zip -r ${{ matrix.project }}_${{ matrix.framework }}_${{ matrix.runtime }}_${{ matrix.conf }}.zip ${{ matrix.project }}/bin/${{ matrix.conf }}/${{ matrix.framework }}/${{ matrix.runtime }}/publish/
run: |
cd ${{ matrix.project }}/bin/Debug/${{ matrix.framework }}/${{ matrix.runtime }}/publish/
zip -r ${{ github.workspace }}/${{ matrix.project }}_${{ matrix.framework }}_${{ matrix.runtime }}_${{ matrix.conf }}.zip ./
- name: Upload build
uses: actions/upload-artifact@v4

View File

@@ -11,7 +11,10 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Build
run: dotnet build
run: dotnet build
- name: Run tests
run: dotnet test

4
.vscode/launch.json vendored
View File

@@ -5,12 +5,12 @@
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch (Test)",
"name": ".NET Core Launch (InfoPrint)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/Test/bin/Debug/net8.0/Test.dll",
"program": "${workspaceFolder}/InfoPrint/bin/Debug/net9.0/InfoPrint.dll",
"args": [],
"cwd": "${workspaceFolder}",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console

View File

@@ -0,0 +1,37 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
<OutputType>Exe</OutputType>
<CheckEolTargetFramework>false</CheckEolTargetFramework>
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<Version>1.8.0</Version>
</PropertyGroup>
<!-- Support All Frameworks -->
<PropertyGroup Condition="$(TargetFramework.StartsWith(`net2`)) OR $(TargetFramework.StartsWith(`net3`)) OR $(TargetFramework.StartsWith(`net4`))">
<RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
</PropertyGroup>
<PropertyGroup Condition="$(TargetFramework.StartsWith(`netcoreapp`)) OR $(TargetFramework.StartsWith(`net5`))">
<RuntimeIdentifiers>win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64</RuntimeIdentifiers>
</PropertyGroup>
<PropertyGroup Condition="$(TargetFramework.StartsWith(`net6`)) OR $(TargetFramework.StartsWith(`net7`)) OR $(TargetFramework.StartsWith(`net8`)) OR $(TargetFramework.StartsWith(`net9`))">
<RuntimeIdentifiers>win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64</RuntimeIdentifiers>
</PropertyGroup>
<PropertyGroup Condition="$(RuntimeIdentifier.StartsWith(`osx-arm`))">
<TargetFrameworks>net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\SabreTools.Serialization\SabreTools.Serialization.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="SabreTools.IO" Version="1.6.1" />
</ItemGroup>
</Project>

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace Test
namespace InfoPrint
{
/// <summary>
/// Set of options for the test executable
@@ -20,7 +20,7 @@ namespace Test
/// </summary>
public List<string> InputPaths { get; private set; } = [];
#if NETCOREAPP3_1_OR_GREATER
#if NETCOREAPP
/// <summary>
/// Enable JSON output
/// </summary>
@@ -76,7 +76,7 @@ namespace Test
case "-j":
case "--json":
#if NET6_0_OR_GREATER
#if NETCOREAPP
options.Json = true;
#else
Console.WriteLine("JSON output not available in .NET Framework");
@@ -104,15 +104,15 @@ namespace Test
/// </summary>
public static void DisplayHelp()
{
Console.WriteLine("SabreTools.Serialization Test Program");
Console.WriteLine("Information Printing Program");
Console.WriteLine();
Console.WriteLine("test.exe <options> file|directory ...");
Console.WriteLine("infoprint.exe <options> file|directory ...");
Console.WriteLine();
Console.WriteLine("Options:");
Console.WriteLine("-?, -h, --help Display this help text and quit");
Console.WriteLine("-d, --debug Enable debug mode");
#if NET6_0_OR_GREATER
Console.WriteLine("-j, --json Print executable info as JSON");
#if NETCOREAPP
Console.WriteLine("-j, --json Print info as JSON");
#endif
}
}

View File

@@ -4,7 +4,7 @@ using SabreTools.IO.Extensions;
using SabreTools.Serialization;
using SabreTools.Serialization.Wrappers;
namespace Test
namespace InfoPrint
{
public static class Program
{
@@ -48,11 +48,7 @@ namespace Test
}
else if (Directory.Exists(path))
{
#if NET20 || NET35
foreach (string file in Directory.GetFiles(path, "*", SearchOption.AllDirectories))
#else
foreach (string file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories))
#endif
foreach (string file in IOExtensions.SafeEnumerateFiles(path, "*", SearchOption.AllDirectories))
{
PrintFileInfo(file, json, debug);
}
@@ -99,7 +95,7 @@ namespace Test
// Get the base info output name
string filenameBase = $"info-{DateTime.Now:yyyy-MM-dd_HHmmss.ffff}";
#if NET6_0_OR_GREATER
#if NETCOREAPP
// If we have the JSON flag
if (json)
{

View File

@@ -4,6 +4,12 @@ This library comprises of serializers that both read and write from files and st
Find the link to the Nuget package [here](https://www.nuget.org/packages/SabreTools.Serialization).
## Releases
For the most recent stable build, download the latest release here: [Releases Page](https://github.com/SabreTools/SabreTools.Serialization/releases)
For the latest WIP build here: [Rolling Release](https://github.com/SabreTools/SabreTools.Serialization/releases/tag/rolling)
## Interfaces
Below is a table representing the various conversion interfaces that are implemented within this library.

View File

@@ -0,0 +1,173 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class ArchiveDotOrgTests
{
[Fact]
public void RoundTripTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.ArchiveDotOrg();
// Build the data
Models.ArchiveDotOrg.Files files = Build();
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(files);
Assert.NotNull(metadata);
// Serialize back to original model
Models.ArchiveDotOrg.Files? newFiles = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newFiles);
Assert.NotNull(newFiles.File);
var newFile = Assert.Single(newFiles.File);
Validate(newFile);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.ArchiveDotOrg.Files Build()
{
var file = new Models.ArchiveDotOrg.File
{
Name = "XXXXXX",
Source = "XXXXXX",
BitTorrentMagnetHash = "XXXXXX",
LastModifiedTime = "XXXXXX",
Size = "XXXXXX",
MD5 = "XXXXXX",
CRC32 = "XXXXXX",
SHA1 = "XXXXXX",
FileCount = "XXXXXX",
Format = "XXXXXX",
Original = "XXXXXX",
Summation = "XXXXXX",
MatrixNumber = "XXXXXX",
CollectionCatalogNumber = "XXXXXX",
Publisher = "XXXXXX",
Comment = "XXXXXX",
ASRDetectedLang = "XXXXXX",
ASRDetectedLangConf = "XXXXXX",
ASRTranscribedLang = "XXXXXX",
WhisperASRModuleVersion = "XXXXXX",
WhisperModelHash = "XXXXXX",
WhisperModelName = "XXXXXX",
WhisperVersion = "XXXXXX",
ClothCoverDetectionModuleVersion = "XXXXXX",
hOCRCharToWordhOCRVersion = "XXXXXX",
hOCRCharToWordModuleVersion = "XXXXXX",
hOCRFtsTexthOCRVersion = "XXXXXX",
hOCRFtsTextModuleVersion = "XXXXXX",
hOCRPageIndexhOCRVersion = "XXXXXX",
hOCRPageIndexModuleVersion = "XXXXXX",
TesseractOCR = "XXXXXX",
TesseractOCRConverted = "XXXXXX",
TesseractOCRDetectedLang = "XXXXXX",
TesseractOCRDetectedLangConf = "XXXXXX",
TesseractOCRDetectedScript = "XXXXXX",
TesseractOCRDetectedScriptConf = "XXXXXX",
TesseractOCRModuleVersion = "XXXXXX",
TesseractOCRParameters = "XXXXXX",
PDFModuleVersion = "XXXXXX",
WordConfidenceInterval0To10 = "XXXXXX",
WordConfidenceInterval11To20 = "XXXXXX",
WordConfidenceInterval21To30 = "XXXXXX",
WordConfidenceInterval31To40 = "XXXXXX",
WordConfidenceInterval41To50 = "XXXXXX",
WordConfidenceInterval51To60 = "XXXXXX",
WordConfidenceInterval61To70 = "XXXXXX",
WordConfidenceInterval71To80 = "XXXXXX",
WordConfidenceInterval81To90 = "XXXXXX",
WordConfidenceInterval91To100 = "XXXXXX",
Album = "XXXXXX",
Artist = "XXXXXX",
Bitrate = "XXXXXX",
Creator = "XXXXXX",
Height = "XXXXXX",
Length = "XXXXXX",
PreviewImage = "XXXXXX",
Rotation = "XXXXXX",
Title = "XXXXXX",
Track = "XXXXXX",
Width = "XXXXXX",
};
return new Models.ArchiveDotOrg.Files
{
File = [file]
};
}
/// <summary>
/// Validate a File
/// </summary>
private static void Validate(Models.ArchiveDotOrg.File? file)
{
Assert.NotNull(file);
Assert.Equal("XXXXXX", file.Name);
Assert.Equal("XXXXXX", file.Source);
Assert.Equal("XXXXXX", file.BitTorrentMagnetHash);
Assert.Equal("XXXXXX", file.LastModifiedTime);
Assert.Equal("XXXXXX", file.Size);
Assert.Equal("XXXXXX", file.MD5);
Assert.Equal("XXXXXX", file.CRC32);
Assert.Equal("XXXXXX", file.SHA1);
Assert.Equal("XXXXXX", file.FileCount);
Assert.Equal("XXXXXX", file.Format);
Assert.Equal("XXXXXX", file.Original);
Assert.Equal("XXXXXX", file.Summation);
Assert.Equal("XXXXXX", file.MatrixNumber);
Assert.Equal("XXXXXX", file.CollectionCatalogNumber);
Assert.Equal("XXXXXX", file.Publisher);
Assert.Equal("XXXXXX", file.Comment);
Assert.Equal("XXXXXX", file.ASRDetectedLang);
Assert.Equal("XXXXXX", file.ASRDetectedLangConf);
Assert.Equal("XXXXXX", file.ASRTranscribedLang);
Assert.Equal("XXXXXX", file.WhisperASRModuleVersion);
Assert.Equal("XXXXXX", file.WhisperModelHash);
Assert.Equal("XXXXXX", file.WhisperModelName);
Assert.Equal("XXXXXX", file.WhisperVersion);
Assert.Equal("XXXXXX", file.ClothCoverDetectionModuleVersion);
Assert.Equal("XXXXXX", file.hOCRCharToWordhOCRVersion);
Assert.Equal("XXXXXX", file.hOCRCharToWordModuleVersion);
Assert.Equal("XXXXXX", file.hOCRFtsTexthOCRVersion);
Assert.Equal("XXXXXX", file.hOCRFtsTextModuleVersion);
Assert.Equal("XXXXXX", file.hOCRPageIndexhOCRVersion);
Assert.Equal("XXXXXX", file.hOCRPageIndexModuleVersion);
Assert.Equal("XXXXXX", file.TesseractOCR);
Assert.Equal("XXXXXX", file.TesseractOCRConverted);
Assert.Equal("XXXXXX", file.TesseractOCRDetectedLang);
Assert.Equal("XXXXXX", file.TesseractOCRDetectedLangConf);
Assert.Equal("XXXXXX", file.TesseractOCRDetectedScript);
Assert.Equal("XXXXXX", file.TesseractOCRDetectedScriptConf);
Assert.Equal("XXXXXX", file.TesseractOCRModuleVersion);
Assert.Equal("XXXXXX", file.TesseractOCRParameters);
Assert.Equal("XXXXXX", file.PDFModuleVersion);
Assert.Equal("XXXXXX", file.WordConfidenceInterval0To10);
Assert.Equal("XXXXXX", file.WordConfidenceInterval11To20);
Assert.Equal("XXXXXX", file.WordConfidenceInterval21To30);
Assert.Equal("XXXXXX", file.WordConfidenceInterval31To40);
Assert.Equal("XXXXXX", file.WordConfidenceInterval41To50);
Assert.Equal("XXXXXX", file.WordConfidenceInterval51To60);
Assert.Equal("XXXXXX", file.WordConfidenceInterval61To70);
Assert.Equal("XXXXXX", file.WordConfidenceInterval71To80);
Assert.Equal("XXXXXX", file.WordConfidenceInterval81To90);
Assert.Equal("XXXXXX", file.WordConfidenceInterval91To100);
Assert.Equal("XXXXXX", file.Album);
Assert.Equal("XXXXXX", file.Artist);
Assert.Equal("XXXXXX", file.Bitrate);
Assert.Equal("XXXXXX", file.Creator);
Assert.Equal("XXXXXX", file.Height);
Assert.Equal("XXXXXX", file.Length);
Assert.Equal("XXXXXX", file.PreviewImage);
Assert.Equal("XXXXXX", file.Rotation);
Assert.Equal("XXXXXX", file.Title);
Assert.Equal("XXXXXX", file.Track);
Assert.Equal("XXXXXX", file.Width);
}
}
}

View File

@@ -0,0 +1,111 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class AttractModeTests
{
[Fact]
public void RoundTripTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.AttractMode();
// Build the data
Models.AttractMode.MetadataFile mf = Build();
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(mf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.AttractMode.MetadataFile? newMf = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.Header);
Assert.NotNull(newMf.Row);
var newRow = Assert.Single(newMf.Row);
Validate(newRow);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.AttractMode.MetadataFile Build()
{
string[] header = ["header"];
var row = new Models.AttractMode.Row
{
Name = "XXXXXX",
Title = "XXXXXX",
Emulator = "XXXXXX",
CloneOf = "XXXXXX",
Year = "XXXXXX",
Manufacturer = "XXXXXX",
Category = "XXXXXX",
Players = "XXXXXX",
Rotation = "XXXXXX",
Control = "XXXXXX",
Status = "XXXXXX",
DisplayCount = "XXXXXX",
DisplayType = "XXXXXX",
AltRomname = "XXXXXX",
AltTitle = "XXXXXX",
Extra = "XXXXXX",
Buttons = "XXXXXX",
Favorite = "XXXXXX",
Tags = "XXXXXX",
PlayedCount = "XXXXXX",
PlayedTime = "XXXXXX",
FileIsAvailable = "XXXXXX",
};
return new Models.AttractMode.MetadataFile
{
Header = header,
Row = [row],
};
}
/// <summary>
/// Validate a header
/// </summary>
private static void Validate(string[]? header)
{
Assert.NotNull(header);
string column = Assert.Single(header);
Assert.Equal("header", column);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void Validate(Models.AttractMode.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.Name);
Assert.Equal("XXXXXX", row.Title);
Assert.Equal("XXXXXX", row.Emulator);
Assert.Equal("XXXXXX", row.CloneOf);
Assert.Equal("XXXXXX", row.Year);
Assert.Equal("XXXXXX", row.Manufacturer);
Assert.Equal("XXXXXX", row.Category);
Assert.Equal("XXXXXX", row.Players);
Assert.Equal("XXXXXX", row.Rotation);
Assert.Equal("XXXXXX", row.Control);
Assert.Equal("XXXXXX", row.Status);
Assert.Equal("XXXXXX", row.DisplayCount);
Assert.Equal("XXXXXX", row.DisplayType);
Assert.Equal("XXXXXX", row.AltRomname);
Assert.Equal("XXXXXX", row.AltTitle);
Assert.Equal("XXXXXX", row.Extra);
Assert.Equal("XXXXXX", row.Buttons);
Assert.Equal("XXXXXX", row.Favorite);
Assert.Equal("XXXXXX", row.Tags);
Assert.Equal("XXXXXX", row.PlayedCount);
Assert.Equal("XXXXXX", row.PlayedTime);
Assert.Equal("XXXXXX", row.FileIsAvailable);
}
}
}

View File

@@ -0,0 +1,492 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class ClrMameProTests
{
[Fact]
public void RoundTripGameTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.ClrMamePro();
// Build the data
Models.ClrMamePro.MetadataFile mf = Build(game: true);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(mf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.ClrMamePro.MetadataFile? newMf = serializer.Deserialize(metadata, game: true);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.ClrMamePro);
Assert.NotNull(newMf.Game);
var newGame = Assert.Single(newMf.Game);
Validate(newGame);
}
[Fact]
public void RoundTripMachineTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.ClrMamePro();
// Build the data
Models.ClrMamePro.MetadataFile mf = Build(game: false);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(mf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.ClrMamePro.MetadataFile? newMf = serializer.Deserialize(metadata, game: false);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.ClrMamePro);
Assert.NotNull(newMf.Game);
var newGame = Assert.Single(newMf.Game);
Validate(newGame);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.ClrMamePro.MetadataFile Build(bool game)
{
var cmp = new Models.ClrMamePro.ClrMamePro
{
Name = "XXXXXX",
Description = "XXXXXX",
RootDir = "XXXXXX",
Category = "XXXXXX",
Version = "XXXXXX",
Date = "XXXXXX",
Author = "XXXXXX",
Homepage = "XXXXXX",
Url = "XXXXXX",
Comment = "XXXXXX",
Header = "XXXXXX",
Type = "XXXXXX",
ForceMerging = "XXXXXX",
ForceZipping = "XXXXXX",
ForcePacking = "XXXXXX",
};
var release = new Models.ClrMamePro.Release
{
Name = "XXXXXX",
Region = "XXXXXX",
Language = "XXXXXX",
Date = "XXXXXX",
Default = "XXXXXX",
};
var biosset = new Models.ClrMamePro.BiosSet
{
Name = "XXXXXX",
Description = "XXXXXX",
Default = "XXXXXX",
};
var rom = new Models.ClrMamePro.Rom
{
Name = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Status = "XXXXXX",
Flags = "XXXXXX",
Date = "XXXXXX",
SHA256 = "XXXXXX",
SHA384 = "XXXXXX",
SHA512 = "XXXXXX",
SpamSum = "XXXXXX",
xxHash364 = "XXXXXX",
xxHash3128 = "XXXXXX",
Region = "XXXXXX",
Offs = "XXXXXX",
Serial = "XXXXXX",
Header = "XXXXXX",
Inverted = "XXXXXX",
MIA = "XXXXXX",
};
var disk = new Models.ClrMamePro.Disk
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Status = "XXXXXX",
Flags = "XXXXXX",
};
var sample = new Models.ClrMamePro.Sample
{
Name = "XXXXXX",
};
var archive = new Models.ClrMamePro.Archive
{
Name = "XXXXXX",
};
var media = new Models.ClrMamePro.Media
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
SHA256 = "XXXXXX",
SpamSum = "XXXXXX",
};
var chip = new Models.ClrMamePro.Chip
{
Type = "XXXXXX",
Name = "XXXXXX",
Flags = "XXXXXX",
Clock = "XXXXXX",
};
var video = new Models.ClrMamePro.Video
{
Screen = "XXXXXX",
Orientation = "XXXXXX",
X = "XXXXXX",
Y = "XXXXXX",
AspectX = "XXXXXX",
AspectY = "XXXXXX",
Freq = "XXXXXX",
};
var sound = new Models.ClrMamePro.Sound
{
Channels = "XXXXXX",
};
var input = new Models.ClrMamePro.Input
{
Players = "XXXXXX",
Control = "XXXXXX",
Buttons = "XXXXXX",
Coins = "XXXXXX",
Tilt = "XXXXXX",
Service = "XXXXXX",
};
var dipswitch = new Models.ClrMamePro.DipSwitch
{
Name = "XXXXXX",
Entry = ["XXXXXX"],
Default = "XXXXXX",
};
var driver = new Models.ClrMamePro.Driver
{
Status = "XXXXXX",
Color = "XXXXXX",
Sound = "XXXXXX",
PaletteSize = "XXXXXX",
Blit = "XXXXXX",
};
// TODO: This omits Set, should that have a separate case?
Models.ClrMamePro.GameBase gameBase = game
? new Models.ClrMamePro.Game()
: new Models.ClrMamePro.Machine();
gameBase.Name = "XXXXXX";
gameBase.Description = "XXXXXX";
gameBase.Year = "XXXXXX";
gameBase.Manufacturer = "XXXXXX";
gameBase.Category = "XXXXXX";
gameBase.CloneOf = "XXXXXX";
gameBase.RomOf = "XXXXXX";
gameBase.SampleOf = "XXXXXX";
gameBase.Release = [release];
gameBase.BiosSet = [biosset];
gameBase.Rom = [rom];
gameBase.Disk = [disk];
gameBase.Sample = [sample];
gameBase.Archive = [archive];
gameBase.Media = [media];
gameBase.Chip = [chip];
gameBase.Video = [video];
gameBase.Sound = sound;
gameBase.Input = input;
gameBase.DipSwitch = [dipswitch];
gameBase.Driver = driver;
return new Models.ClrMamePro.MetadataFile
{
ClrMamePro = cmp,
Game = [gameBase],
};
}
/// <summary>
/// Validate a ClrMamePro
/// </summary>
private static void Validate(Models.ClrMamePro.ClrMamePro? cmp)
{
Assert.NotNull(cmp);
Assert.Equal("XXXXXX", cmp.Name);
Assert.Equal("XXXXXX", cmp.Description);
Assert.Equal("XXXXXX", cmp.RootDir);
Assert.Equal("XXXXXX", cmp.Category);
Assert.Equal("XXXXXX", cmp.Version);
Assert.Equal("XXXXXX", cmp.Date);
Assert.Equal("XXXXXX", cmp.Author);
Assert.Equal("XXXXXX", cmp.Homepage);
Assert.Equal("XXXXXX", cmp.Url);
Assert.Equal("XXXXXX", cmp.Comment);
Assert.Equal("XXXXXX", cmp.Header);
Assert.Equal("XXXXXX", cmp.Type);
Assert.Equal("XXXXXX", cmp.ForceMerging);
Assert.Equal("XXXXXX", cmp.ForceZipping);
Assert.Equal("XXXXXX", cmp.ForcePacking);
}
/// <summary>
/// Validate a GameBase
/// </summary>
private static void Validate(Models.ClrMamePro.GameBase? gb)
{
Assert.NotNull(gb);
Assert.Equal("XXXXXX", gb.Name);
Assert.Equal("XXXXXX", gb.Description);
Assert.Equal("XXXXXX", gb.Year);
Assert.Equal("XXXXXX", gb.Manufacturer);
Assert.Equal("XXXXXX", gb.Category);
Assert.Equal("XXXXXX", gb.CloneOf);
Assert.Equal("XXXXXX", gb.RomOf);
Assert.Equal("XXXXXX", gb.SampleOf);
Assert.NotNull(gb.Release);
var release = Assert.Single(gb.Release);
Validate(release);
Assert.NotNull(gb.BiosSet);
var biosset = Assert.Single(gb.BiosSet);
Validate(biosset);
Assert.NotNull(gb.Rom);
var rom = Assert.Single(gb.Rom);
Validate(rom);
Assert.NotNull(gb.Disk);
var disk = Assert.Single(gb.Disk);
Validate(disk);
Assert.NotNull(gb.Sample);
var sample = Assert.Single(gb.Sample);
Validate(sample);
Assert.NotNull(gb.Archive);
var archive = Assert.Single(gb.Archive);
Validate(archive);
Assert.NotNull(gb.Media);
var media = Assert.Single(gb.Media);
Validate(media);
Assert.NotNull(gb.Chip);
var chip = Assert.Single(gb.Chip);
Validate(chip);
Assert.NotNull(gb.Video);
var video = Assert.Single(gb.Video);
Validate(video);
Validate(gb.Sound);
Validate(gb.Input);
Assert.NotNull(gb.DipSwitch);
var dipswitch = Assert.Single(gb.DipSwitch);
Validate(dipswitch);
Validate(gb.Driver);
}
/// <summary>
/// Validate a Release
/// </summary>
private static void Validate(Models.ClrMamePro.Release? release)
{
Assert.NotNull(release);
Assert.Equal("XXXXXX", release.Name);
Assert.Equal("XXXXXX", release.Region);
Assert.Equal("XXXXXX", release.Language);
Assert.Equal("XXXXXX", release.Date);
Assert.Equal("XXXXXX", release.Default);
}
/// <summary>
/// Validate a BiosSet
/// </summary>
private static void Validate(Models.ClrMamePro.BiosSet? biosset)
{
Assert.NotNull(biosset);
Assert.Equal("XXXXXX", biosset.Name);
Assert.Equal("XXXXXX", biosset.Description);
Assert.Equal("XXXXXX", biosset.Default);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.ClrMamePro.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX", rom.MD5);
Assert.Equal("XXXXXX", rom.SHA1);
Assert.Equal("XXXXXX", rom.Merge);
Assert.Equal("XXXXXX", rom.Status);
Assert.Equal("XXXXXX", rom.Flags);
Assert.Equal("XXXXXX", rom.Date);
Assert.Equal("XXXXXX", rom.SHA256);
Assert.Equal("XXXXXX", rom.SHA384);
Assert.Equal("XXXXXX", rom.SHA512);
Assert.Equal("XXXXXX", rom.SpamSum);
Assert.Equal("XXXXXX", rom.xxHash364);
Assert.Equal("XXXXXX", rom.xxHash3128);
Assert.Equal("XXXXXX", rom.Region);
Assert.Equal("XXXXXX", rom.Offs);
Assert.Equal("XXXXXX", rom.Serial);
Assert.Equal("XXXXXX", rom.Header);
Assert.Equal("XXXXXX", rom.Inverted);
Assert.Equal("XXXXXX", rom.MIA);
}
/// <summary>
/// Validate a Disk
/// </summary>
private static void Validate(Models.ClrMamePro.Disk? disk)
{
Assert.NotNull(disk);
Assert.Equal("XXXXXX", disk.Name);
Assert.Equal("XXXXXX", disk.MD5);
Assert.Equal("XXXXXX", disk.SHA1);
Assert.Equal("XXXXXX", disk.Merge);
Assert.Equal("XXXXXX", disk.Status);
Assert.Equal("XXXXXX", disk.Flags);
}
/// <summary>
/// Validate a Sample
/// </summary>
private static void Validate(Models.ClrMamePro.Sample? sample)
{
Assert.NotNull(sample);
Assert.Equal("XXXXXX", sample.Name);
}
/// <summary>
/// Validate a Archive
/// </summary>
private static void Validate(Models.ClrMamePro.Archive? archive)
{
Assert.NotNull(archive);
Assert.Equal("XXXXXX", archive.Name);
}
/// <summary>
/// Validate a Media
/// </summary>
private static void Validate(Models.ClrMamePro.Media? media)
{
Assert.NotNull(media);
Assert.Equal("XXXXXX", media.Name);
Assert.Equal("XXXXXX", media.MD5);
Assert.Equal("XXXXXX", media.SHA1);
Assert.Equal("XXXXXX", media.SHA256);
Assert.Equal("XXXXXX", media.SpamSum);
}
/// <summary>
/// Validate a Chip
/// </summary>
private static void Validate(Models.ClrMamePro.Chip? chip)
{
Assert.NotNull(chip);
Assert.Equal("XXXXXX", chip.Type);
Assert.Equal("XXXXXX", chip.Name);
Assert.Equal("XXXXXX", chip.Flags);
Assert.Equal("XXXXXX", chip.Clock);
}
/// <summary>
/// Validate a Video
/// </summary>
private static void Validate(Models.ClrMamePro.Video? video)
{
Assert.NotNull(video);
Assert.Equal("XXXXXX", video.Screen);
Assert.Equal("XXXXXX", video.Orientation);
Assert.Equal("XXXXXX", video.X);
Assert.Equal("XXXXXX", video.Y);
Assert.Equal("XXXXXX", video.AspectX);
Assert.Equal("XXXXXX", video.AspectY);
Assert.Equal("XXXXXX", video.Freq);
}
/// <summary>
/// Validate a Sound
/// </summary>
private static void Validate(Models.ClrMamePro.Sound? sound)
{
Assert.NotNull(sound);
Assert.Equal("XXXXXX", sound.Channels);
}
/// <summary>
/// Validate a Input
/// </summary>
private static void Validate(Models.ClrMamePro.Input? input)
{
Assert.NotNull(input);
Assert.Equal("XXXXXX", input.Players);
Assert.Equal("XXXXXX", input.Control);
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.Equal("XXXXXX", input.Tilt);
Assert.Equal("XXXXXX", input.Service);
}
/// <summary>
/// Validate a DipSwitch
/// </summary>
private static void Validate(Models.ClrMamePro.DipSwitch? dipswitch)
{
Assert.NotNull(dipswitch);
Assert.Equal("XXXXXX", dipswitch.Name);
Assert.NotNull(dipswitch.Entry);
string entry = Assert.Single(dipswitch.Entry);
Assert.Equal("XXXXXX", entry);
Assert.Equal("XXXXXX", dipswitch.Default);
}
/// <summary>
/// Validate a Driver
/// </summary>
private static void Validate(Models.ClrMamePro.Driver? driver)
{
Assert.NotNull(driver);
Assert.Equal("XXXXXX", driver.Status);
Assert.Equal("XXXXXX", driver.Color);
Assert.Equal("XXXXXX", driver.Sound);
Assert.Equal("XXXXXX", driver.PaletteSize);
Assert.Equal("XXXXXX", driver.Blit);
}
}
}

View File

@@ -0,0 +1,108 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class DosCenterTests
{
[Fact]
public void RoundTripTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.DosCenter();
// Build the data
Models.DosCenter.MetadataFile mf = Build();
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(mf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.DosCenter.MetadataFile? newMf = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.DosCenter);
Assert.NotNull(newMf.Game);
var newGame = Assert.Single(newMf.Game);
Validate(newGame);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.DosCenter.MetadataFile Build()
{
var dc = new Models.DosCenter.DosCenter
{
Name = "XXXXXX",
Description = "XXXXXX",
Version = "XXXXXX",
Date = "XXXXXX",
Author = "XXXXXX",
Homepage = "XXXXXX",
Comment = "XXXXXX",
};
var file = new Models.DosCenter.File
{
Name = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
Date = "XXXXXX",
};
var game = new Models.DosCenter.Game
{
Name = "XXXXXX",
File = [file],
};
return new Models.DosCenter.MetadataFile
{
DosCenter = dc,
Game = [game],
};
}
/// <summary>
/// Validate a DosCenter
/// </summary>
private static void Validate(Models.DosCenter.DosCenter? cmp)
{
Assert.NotNull(cmp);
Assert.Equal("XXXXXX", cmp.Name);
Assert.Equal("XXXXXX", cmp.Description);
Assert.Equal("XXXXXX", cmp.Version);
Assert.Equal("XXXXXX", cmp.Date);
Assert.Equal("XXXXXX", cmp.Author);
Assert.Equal("XXXXXX", cmp.Homepage);
Assert.Equal("XXXXXX", cmp.Comment);
}
/// <summary>
/// Validate a Game
/// </summary>
private static void Validate(Models.DosCenter.Game? game)
{
Assert.NotNull(game);
Assert.Equal("XXXXXX", game.Name);
Assert.NotNull(game.File);
var file = Assert.Single(game.File);
Validate(file);
}
/// <summary>
/// Validate a File
/// </summary>
private static void Validate(Models.DosCenter.File? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX", rom.Date);
}
}
}

View File

@@ -0,0 +1,65 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class EverdriveSMDBTests
{
[Fact]
public void RoundTripTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.EverdriveSMDB();
// Build the data
Models.EverdriveSMDB.MetadataFile mf = Build();
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(mf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.EverdriveSMDB.MetadataFile? newMf = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newMf);
Assert.NotNull(newMf.Row);
var newRow = Assert.Single(newMf.Row);
Validate(newRow);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.EverdriveSMDB.MetadataFile Build()
{
var row = new Models.EverdriveSMDB.Row
{
SHA256 = "XXXXXX",
Name = "XXXXXX",
SHA1 = "XXXXXX",
MD5 = "XXXXXX",
CRC32 = "XXXXXX",
Size = "XXXXXX",
};
return new Models.EverdriveSMDB.MetadataFile
{
Row = [row],
};
}
/// <summary>
/// Validate a Row
/// </summary>
private static void Validate(Models.EverdriveSMDB.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.SHA256);
Assert.Equal("XXXXXX", row.Name);
Assert.Equal("XXXXXX", row.SHA1);
Assert.Equal("XXXXXX", row.MD5);
Assert.Equal("XXXXXX", row.CRC32);
Assert.Equal("XXXXXX", row.Size);
}
}
}

View File

@@ -0,0 +1,326 @@
using System;
using SabreTools.Hashing;
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class HashfileTests
{
[Fact]
public void RoundTripSFVTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.CRC32);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(hf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = serializer.Deserialize(metadata, HashType.CRC32);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SFV);
var newSfv = Assert.Single(newHf.SFV);
Validate(newSfv);
}
[Fact]
public void RoundTripMD2Test()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.MD2);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(hf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = serializer.Deserialize(metadata, HashType.MD2);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.MD2);
var newMd2 = Assert.Single(newHf.MD2);
Validate(newMd2);
}
[Fact]
public void RoundTripMD4Test()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.MD4);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(hf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = serializer.Deserialize(metadata, HashType.MD4);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.MD4);
var newMd4 = Assert.Single(newHf.MD4);
Validate(newMd4);
}
[Fact]
public void RoundTripMD5Test()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.MD5);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(hf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = serializer.Deserialize(metadata, HashType.MD5);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.MD5);
var newMd5 = Assert.Single(newHf.MD5);
Validate(newMd5);
}
[Fact]
public void RoundTripSHA1Test()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.SHA1);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(hf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = serializer.Deserialize(metadata, HashType.SHA1);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SHA1);
var newSha1 = Assert.Single(newHf.SHA1);
Validate(newSha1);
}
[Fact]
public void RoundTripSHA256Test()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.SHA256);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(hf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = serializer.Deserialize(metadata, HashType.SHA256);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SHA256);
var newSha256 = Assert.Single(newHf.SHA256);
Validate(newSha256);
}
[Fact]
public void RoundTripSHA384Test()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.SHA384);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(hf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = serializer.Deserialize(metadata, HashType.SHA384);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SHA384);
var newSha384 = Assert.Single(newHf.SHA384);
Validate(newSha384);
}
[Fact]
public void RoundTripSHA512Test()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.SHA512);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(hf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = serializer.Deserialize(metadata, HashType.SHA512);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SHA512);
var newSha512 = Assert.Single(newHf.SHA512);
Validate(newSha512);
}
[Fact]
public void RoundTripSpamSumTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.SpamSum);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(hf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = serializer.Deserialize(metadata, HashType.SpamSum);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SpamSum);
var newSpamsum = Assert.Single(newHf.SpamSum);
Validate(newSpamsum);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.Hashfile.Hashfile Build(HashType hashType)
{
return hashType switch
{
HashType.CRC32 => new Models.Hashfile.Hashfile { SFV = [new Models.Hashfile.SFV { File = "XXXXXX", Hash = "XXXXXX" }] },
HashType.MD2 => new Models.Hashfile.Hashfile { MD2 = [new Models.Hashfile.MD2 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.MD4 => new Models.Hashfile.Hashfile { MD4 = [new Models.Hashfile.MD4 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.MD5 => new Models.Hashfile.Hashfile { MD5 = [new Models.Hashfile.MD5 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA1 => new Models.Hashfile.Hashfile { SHA1 = [new Models.Hashfile.SHA1 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA256 => new Models.Hashfile.Hashfile { SHA256 = [new Models.Hashfile.SHA256 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA384 => new Models.Hashfile.Hashfile { SHA384 = [new Models.Hashfile.SHA384 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA512 => new Models.Hashfile.Hashfile { SHA512 = [new Models.Hashfile.SHA512 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SpamSum => new Models.Hashfile.Hashfile { SpamSum = [new Models.Hashfile.SpamSum { Hash = "XXXXXX", File = "XXXXXX" }] },
_ => throw new ArgumentOutOfRangeException(),
};
}
/// <summary>
/// Validate a SFV
/// </summary>
private static void Validate(Models.Hashfile.SFV? sfv)
{
Assert.NotNull(sfv);
Assert.Equal("XXXXXX", sfv.File);
Assert.Equal("XXXXXX", sfv.Hash);
}
/// <summary>
/// Validate a MD2
/// </summary>
private static void Validate(Models.Hashfile.MD2? md2)
{
Assert.NotNull(md2);
Assert.Equal("XXXXXX", md2.Hash);
Assert.Equal("XXXXXX", md2.File);
}
/// <summary>
/// Validate a MD4
/// </summary>
private static void Validate(Models.Hashfile.MD4? md4)
{
Assert.NotNull(md4);
Assert.Equal("XXXXXX", md4.Hash);
Assert.Equal("XXXXXX", md4.File);
}
/// <summary>
/// Validate a MD5
/// </summary>
private static void Validate(Models.Hashfile.MD5? md5)
{
Assert.NotNull(md5);
Assert.Equal("XXXXXX", md5.Hash);
Assert.Equal("XXXXXX", md5.File);
}
/// <summary>
/// Validate a SHA1
/// </summary>
private static void Validate(Models.Hashfile.SHA1? sha1)
{
Assert.NotNull(sha1);
Assert.Equal("XXXXXX", sha1.Hash);
Assert.Equal("XXXXXX", sha1.File);
}
/// <summary>
/// Validate a SHA256
/// </summary>
private static void Validate(Models.Hashfile.SHA256? sha256)
{
Assert.NotNull(sha256);
Assert.Equal("XXXXXX", sha256.Hash);
Assert.Equal("XXXXXX", sha256.File);
}
/// <summary>
/// Validate a SHA384
/// </summary>
private static void Validate(Models.Hashfile.SHA384? sha384)
{
Assert.NotNull(sha384);
Assert.Equal("XXXXXX", sha384.Hash);
Assert.Equal("XXXXXX", sha384.File);
}
/// <summary>
/// Validate a SHA512
/// </summary>
private static void Validate(Models.Hashfile.SHA512? sha512)
{
Assert.NotNull(sha512);
Assert.Equal("XXXXXX", sha512.Hash);
Assert.Equal("XXXXXX", sha512.File);
}
/// <summary>
/// Validate a SpamSum
/// </summary>
private static void Validate(Models.Hashfile.SpamSum? spamsum)
{
Assert.NotNull(spamsum);
Assert.Equal("XXXXXX", spamsum.Hash);
Assert.Equal("XXXXXX", spamsum.File);
}
}
}

View File

@@ -0,0 +1,127 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class ListromTests
{
[Fact]
public void RoundTripTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Listrom();
// Build the data
Models.Listrom.MetadataFile mf = Build();
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(mf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Listrom.MetadataFile? newMf = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newMf);
Assert.NotNull(newMf.Set);
Assert.Equal(2, newMf.Set.Length);
ValidateDevice(newMf.Set[0]);
ValidateDriver(newMf.Set[1]);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.Listrom.MetadataFile Build()
{
var rom = new Models.Listrom.Row
{
Name = "XXXXXX",
Size = "XXXXXX",
Bad = true,
CRC = "XXXXXX",
SHA1 = "XXXXXX",
NoGoodDumpKnown = false,
};
var disk = new Models.Listrom.Row
{
Name = "XXXXXX",
Bad = false,
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
NoGoodDumpKnown = true,
};
var device = new Models.Listrom.Set()
{
Device = "XXXXXX",
Row = [rom],
};
var driver = new Models.Listrom.Set()
{
Driver = "XXXXXX",
Row = [disk],
};
return new Models.Listrom.MetadataFile
{
Set = [device, driver],
};
}
/// <summary>
/// Validate a Set
/// </summary>
private static void ValidateDevice(Models.Listrom.Set? set)
{
Assert.NotNull(set);
Assert.Equal("XXXXXX", set.Device);
Assert.NotNull(set.Row);
var row = Assert.Single(set.Row);
ValidateRom(row);
}
/// <summary>
/// Validate a Set
/// </summary>
private static void ValidateDriver(Models.Listrom.Set? set)
{
Assert.NotNull(set);
Assert.Equal("XXXXXX", set.Driver);
Assert.NotNull(set.Row);
var row = Assert.Single(set.Row);
ValidateDisk(row);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateRom(Models.Listrom.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.Name);
Assert.Equal("XXXXXX", row.Size);
Assert.True(row.Bad);
Assert.Equal("XXXXXX", row.CRC);
Assert.Equal("XXXXXX", row.SHA1);
Assert.False(row.NoGoodDumpKnown);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateDisk(Models.Listrom.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.Name);
Assert.False(row.Bad);
Assert.Equal("XXXXXX", row.MD5);
Assert.Equal("XXXXXX", row.SHA1);
Assert.True(row.NoGoodDumpKnown);
}
}
}

View File

@@ -0,0 +1,878 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class ListxmlTests
{
[Fact]
public void RoundTripGameTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Listxml();
// Build the data
Models.Listxml.Mame mame = Build(game: true);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(mame);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Listxml.Mame? newMame = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newMame);
Assert.Equal("XXXXXX", newMame.Build);
Assert.Equal("XXXXXX", newMame.Debug);
Assert.Equal("XXXXXX", newMame.MameConfig);
Assert.NotNull(newMame.Game);
var newGame = Assert.Single(newMame.Game);
Validate(newGame);
}
[Fact]
public void RoundTripMachineTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Listxml();
// Build the data
Models.Listxml.Mame mame = Build(game: false);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(mame);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Listxml.Mame? newMame = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newMame);
Assert.Equal("XXXXXX", newMame.Build);
Assert.Equal("XXXXXX", newMame.Debug);
Assert.Equal("XXXXXX", newMame.MameConfig);
Assert.NotNull(newMame.Game);
var newGame = Assert.Single(newMame.Game);
Validate(newGame);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.Listxml.Mame Build(bool game)
{
var biosset = new Models.Listxml.BiosSet
{
Name = "XXXXXX",
Description = "XXXXXX",
Default = "XXXXXX",
};
var rom = new Models.Listxml.Rom
{
Name = "XXXXXX",
Bios = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Region = "XXXXXX",
Offset = "XXXXXX",
Status = "XXXXXX",
Optional = "XXXXXX",
Dispose = "XXXXXX",
SoundOnly = "XXXXXX",
};
var disk = new Models.Listxml.Disk
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Region = "XXXXXX",
Index = "XXXXXX",
Writable = "XXXXXX",
Status = "XXXXXX",
Optional = "XXXXXX",
};
var deviceref = new Models.Listxml.DeviceRef
{
Name = "XXXXXX",
};
var sample = new Models.Listxml.Sample
{
Name = "XXXXXX",
};
var chip = new Models.Listxml.Chip
{
Name = "XXXXXX",
Tag = "XXXXXX",
Type = "XXXXXX",
SoundOnly = "XXXXXX",
Clock = "XXXXXX",
};
var display = new Models.Listxml.Display
{
Tag = "XXXXXX",
Type = "XXXXXX",
Rotate = "XXXXXX",
FlipX = "XXXXXX",
Width = "XXXXXX",
Height = "XXXXXX",
Refresh = "XXXXXX",
PixClock = "XXXXXX",
HTotal = "XXXXXX",
HBEnd = "XXXXXX",
HBStart = "XXXXXX",
VTotal = "XXXXXX",
VBEnd = "XXXXXX",
VBStart = "XXXXXX",
};
var video = new Models.Listxml.Video
{
Screen = "XXXXXX",
Orientation = "XXXXXX",
Width = "XXXXXX",
Height = "XXXXXX",
AspectX = "XXXXXX",
AspectY = "XXXXXX",
Refresh = "XXXXXX",
};
var sound = new Models.Listxml.Sound
{
Channels = "XXXXXX",
};
var control = new Models.Listxml.Control
{
Type = "XXXXXX",
Player = "XXXXXX",
Buttons = "XXXXXX",
ReqButtons = "XXXXXX",
Minimum = "XXXXXX",
Maximum = "XXXXXX",
Sensitivity = "XXXXXX",
KeyDelta = "XXXXXX",
Reverse = "XXXXXX",
Ways = "XXXXXX",
Ways2 = "XXXXXX",
Ways3 = "XXXXXX",
};
var input = new Models.Listxml.Input
{
Service = "XXXXXX",
Tilt = "XXXXXX",
Players = "XXXXXX",
//ControlAttr = "XXXXXX", // Mututally exclusive with input.Control
Buttons = "XXXXXX",
Coins = "XXXXXX",
Control = [control],
};
var condition = new Models.Listxml.Condition
{
Tag = "XXXXXX",
Mask = "XXXXXX",
Relation = "XXXXXX",
Value = "XXXXXX",
};
var diplocation = new Models.Listxml.DipLocation
{
Name = "XXXXXX",
Number = "XXXXXX",
Inverted = "XXXXXX",
};
var dipvalue = new Models.Listxml.DipValue
{
Name = "XXXXXX",
Value = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var dipswitch = new Models.Listxml.DipSwitch
{
Name = "XXXXXX",
Tag = "XXXXXX",
Mask = "XXXXXX",
Condition = condition,
DipLocation = [diplocation],
DipValue = [dipvalue],
};
var conflocation = new Models.Listxml.ConfLocation
{
Name = "XXXXXX",
Number = "XXXXXX",
Inverted = "XXXXXX",
};
var confsetting = new Models.Listxml.ConfSetting
{
Name = "XXXXXX",
Value = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var configuration = new Models.Listxml.Configuration
{
Name = "XXXXXX",
Tag = "XXXXXX",
Mask = "XXXXXX",
Condition = condition,
ConfLocation = [conflocation],
ConfSetting = [confsetting],
};
var analog = new Models.Listxml.Analog
{
Mask = "XXXXXX",
};
var port = new Models.Listxml.Port
{
Tag = "XXXXXX",
Analog = [analog],
};
var adjuster = new Models.Listxml.Adjuster
{
Name = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var driver = new Models.Listxml.Driver
{
Status = "XXXXXX",
Color = "XXXXXX",
Sound = "XXXXXX",
PaletteSize = "XXXXXX",
Emulation = "XXXXXX",
Cocktail = "XXXXXX",
SaveState = "XXXXXX",
RequiresArtwork = "XXXXXX",
Unofficial = "XXXXXX",
NoSoundHardware = "XXXXXX",
Incomplete = "XXXXXX",
};
var feature = new Models.Listxml.Feature
{
Type = "XXXXXX",
Status = "XXXXXX",
Overall = "XXXXXX",
};
var instance = new Models.Listxml.Instance
{
Name = "XXXXXX",
BriefName = "XXXXXX",
};
var extension = new Models.Listxml.Extension
{
Name = "XXXXXX",
};
var device = new Models.Listxml.Device
{
Type = "XXXXXX",
Tag = "XXXXXX",
FixedImage = "XXXXXX",
Mandatory = "XXXXXX",
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
};
var slotOption = new Models.Listxml.SlotOption
{
Name = "XXXXXX",
DevName = "XXXXXX",
Default = "XXXXXX",
};
var slot = new Models.Listxml.Slot
{
Name = "XXXXXX",
SlotOption = [slotOption],
};
var softwarelist = new Models.Listxml.SoftwareList
{
Tag = "XXXXXX",
Name = "XXXXXX",
Status = "XXXXXX",
Filter = "XXXXXX",
};
var ramoption = new Models.Listxml.RamOption
{
Name = "XXXXXX",
Default = "XXXXXX",
Content = "XXXXXX",
};
Models.Listxml.GameBase gameBase = game
? new Models.Listxml.Game()
: new Models.Listxml.Machine();
gameBase.Name = "XXXXXX";
gameBase.SourceFile = "XXXXXX";
gameBase.IsBios = "XXXXXX";
gameBase.IsDevice = "XXXXXX";
gameBase.IsMechanical = "XXXXXX";
gameBase.Runnable = "XXXXXX";
gameBase.CloneOf = "XXXXXX";
gameBase.RomOf = "XXXXXX";
gameBase.SampleOf = "XXXXXX";
gameBase.Description = "XXXXXX";
gameBase.Year = "XXXXXX";
gameBase.Manufacturer = "XXXXXX";
gameBase.History = "XXXXXX";
gameBase.BiosSet = [biosset];
gameBase.Rom = [rom];
gameBase.Disk = [disk];
gameBase.DeviceRef = [deviceref];
gameBase.Sample = [sample];
gameBase.Chip = [chip];
gameBase.Display = [display];
gameBase.Video = [video];
gameBase.Sound = sound;
gameBase.Input = input;
gameBase.DipSwitch = [dipswitch];
gameBase.Configuration = [configuration];
gameBase.Port = [port];
gameBase.Adjuster = [adjuster];
gameBase.Driver = driver;
gameBase.Feature = [feature];
gameBase.Device = [device];
gameBase.Slot = [slot];
gameBase.SoftwareList = [softwarelist];
gameBase.RamOption = [ramoption];
return new Models.Listxml.Mame
{
Build = "XXXXXX",
Debug = "XXXXXX",
MameConfig = "XXXXXX",
Game = [gameBase],
};
}
/// <summary>
/// Validate a GameBase
/// </summary>
private static void Validate(Models.Listxml.GameBase? gb)
{
Assert.NotNull(gb);
Assert.Equal("XXXXXX", gb.Name);
Assert.Equal("XXXXXX", gb.SourceFile);
Assert.Equal("XXXXXX", gb.IsBios);
Assert.Equal("XXXXXX", gb.IsDevice);
Assert.Equal("XXXXXX", gb.IsMechanical);
Assert.Equal("XXXXXX", gb.Runnable);
Assert.Equal("XXXXXX", gb.CloneOf);
Assert.Equal("XXXXXX", gb.RomOf);
Assert.Equal("XXXXXX", gb.SampleOf);
Assert.Equal("XXXXXX", gb.Description);
Assert.Equal("XXXXXX", gb.Year);
Assert.Equal("XXXXXX", gb.Manufacturer);
Assert.Equal("XXXXXX", gb.History);
Assert.NotNull(gb.BiosSet);
var biosset = Assert.Single(gb.BiosSet);
Validate(biosset);
Assert.NotNull(gb.Rom);
var rom = Assert.Single(gb.Rom);
Validate(rom);
Assert.NotNull(gb.Disk);
var disk = Assert.Single(gb.Disk);
Validate(disk);
Assert.NotNull(gb.DeviceRef);
var deviceref = Assert.Single(gb.DeviceRef);
Validate(deviceref);
Assert.NotNull(gb.Sample);
var sample = Assert.Single(gb.Sample);
Validate(sample);
Assert.NotNull(gb.Chip);
var chip = Assert.Single(gb.Chip);
Validate(chip);
Assert.NotNull(gb.Display);
var display = Assert.Single(gb.Display);
Validate(display);
Assert.NotNull(gb.Video);
var video = Assert.Single(gb.Video);
Validate(video);
Validate(gb.Sound);
Validate(gb.Input);
Assert.NotNull(gb.DipSwitch);
var dipswitch = Assert.Single(gb.DipSwitch);
Validate(dipswitch);
Assert.NotNull(gb.Configuration);
var configuration = Assert.Single(gb.Configuration);
Validate(configuration);
Assert.NotNull(gb.Port);
var port = Assert.Single(gb.Port);
Validate(port);
Assert.NotNull(gb.Adjuster);
var adjuster = Assert.Single(gb.Adjuster);
Validate(adjuster);
Validate(gb.Driver);
Assert.NotNull(gb.Feature);
var feature = Assert.Single(gb.Feature);
Validate(feature);
Assert.NotNull(gb.Device);
var device = Assert.Single(gb.Device);
Validate(device);
Assert.NotNull(gb.Slot);
var slot = Assert.Single(gb.Slot);
Validate(slot);
Assert.NotNull(gb.SoftwareList);
var softwarelist = Assert.Single(gb.SoftwareList);
Validate(softwarelist);
Assert.NotNull(gb.RamOption);
var ramoption = Assert.Single(gb.RamOption);
Validate(ramoption);
}
/// <summary>
/// Validate a BiosSet
/// </summary>
private static void Validate(Models.Listxml.BiosSet? biosset)
{
Assert.NotNull(biosset);
Assert.Equal("XXXXXX", biosset.Name);
Assert.Equal("XXXXXX", biosset.Description);
Assert.Equal("XXXXXX", biosset.Default);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.Listxml.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Bios);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX", rom.SHA1);
Assert.Equal("XXXXXX", rom.Merge);
Assert.Equal("XXXXXX", rom.Region);
Assert.Equal("XXXXXX", rom.Offset);
Assert.Equal("XXXXXX", rom.Status);
Assert.Equal("XXXXXX", rom.Optional);
Assert.Equal("XXXXXX", rom.Dispose);
Assert.Equal("XXXXXX", rom.SoundOnly);
}
/// <summary>
/// Validate a Disk
/// </summary>
private static void Validate(Models.Listxml.Disk? disk)
{
Assert.NotNull(disk);
Assert.Equal("XXXXXX", disk.Name);
Assert.Equal("XXXXXX", disk.MD5);
Assert.Equal("XXXXXX", disk.SHA1);
Assert.Equal("XXXXXX", disk.Merge);
Assert.Equal("XXXXXX", disk.Region);
Assert.Equal("XXXXXX", disk.Index);
Assert.Equal("XXXXXX", disk.Writable);
Assert.Equal("XXXXXX", disk.Status);
Assert.Equal("XXXXXX", disk.Optional);
}
/// <summary>
/// Validate a DeviceRef
/// </summary>
private static void Validate(Models.Listxml.DeviceRef? deviceref)
{
Assert.NotNull(deviceref);
Assert.Equal("XXXXXX", deviceref.Name);
}
/// <summary>
/// Validate a Sample
/// </summary>
private static void Validate(Models.Listxml.Sample? sample)
{
Assert.NotNull(sample);
Assert.Equal("XXXXXX", sample.Name);
}
/// <summary>
/// Validate a Chip
/// </summary>
private static void Validate(Models.Listxml.Chip? chip)
{
Assert.NotNull(chip);
Assert.Equal("XXXXXX", chip.Name);
Assert.Equal("XXXXXX", chip.Tag);
Assert.Equal("XXXXXX", chip.Type);
Assert.Equal("XXXXXX", chip.SoundOnly);
Assert.Equal("XXXXXX", chip.Clock);
}
/// <summary>
/// Validate a Display
/// </summary>
private static void Validate(Models.Listxml.Display? display)
{
Assert.NotNull(display);
Assert.Equal("XXXXXX", display.Tag);
Assert.Equal("XXXXXX", display.Type);
Assert.Equal("XXXXXX", display.Rotate);
Assert.Equal("XXXXXX", display.FlipX);
Assert.Equal("XXXXXX", display.Width);
Assert.Equal("XXXXXX", display.Height);
Assert.Equal("XXXXXX", display.Refresh);
Assert.Equal("XXXXXX", display.PixClock);
Assert.Equal("XXXXXX", display.HTotal);
Assert.Equal("XXXXXX", display.HBEnd);
Assert.Equal("XXXXXX", display.HBStart);
Assert.Equal("XXXXXX", display.VTotal);
Assert.Equal("XXXXXX", display.VBEnd);
Assert.Equal("XXXXXX", display.VBStart);
}
/// <summary>
/// Validate a Video
/// </summary>
private static void Validate(Models.Listxml.Video? video)
{
Assert.NotNull(video);
Assert.Equal("XXXXXX", video.Screen);
Assert.Equal("XXXXXX", video.Orientation);
Assert.Equal("XXXXXX", video.Width);
Assert.Equal("XXXXXX", video.Height);
Assert.Equal("XXXXXX", video.AspectX);
Assert.Equal("XXXXXX", video.AspectY);
Assert.Equal("XXXXXX", video.Refresh);
}
/// <summary>
/// Validate a Sound
/// </summary>
private static void Validate(Models.Listxml.Sound? sound)
{
Assert.NotNull(sound);
Assert.Equal("XXXXXX", sound.Channels);
}
/// <summary>
/// Validate a Input
/// </summary>
private static void Validate(Models.Listxml.Input? input)
{
Assert.NotNull(input);
Assert.Equal("XXXXXX", input.Service);
Assert.Equal("XXXXXX", input.Tilt);
Assert.Equal("XXXXXX", input.Players);
//Assert.Equal("XXXXXX", input.ControlAttr); // Mututally exclusive with input.Control
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.NotNull(input.Control);
var control = Assert.Single(input.Control);
Validate(control);
}
/// <summary>
/// Validate a Control
/// </summary>
private static void Validate(Models.Listxml.Control? control)
{
Assert.NotNull(control);
Assert.Equal("XXXXXX", control.Type);
Assert.Equal("XXXXXX", control.Player);
Assert.Equal("XXXXXX", control.Buttons);
Assert.Equal("XXXXXX", control.ReqButtons);
Assert.Equal("XXXXXX", control.Minimum);
Assert.Equal("XXXXXX", control.Maximum);
Assert.Equal("XXXXXX", control.Sensitivity);
Assert.Equal("XXXXXX", control.KeyDelta);
Assert.Equal("XXXXXX", control.Reverse);
Assert.Equal("XXXXXX", control.Ways);
Assert.Equal("XXXXXX", control.Ways2);
Assert.Equal("XXXXXX", control.Ways3);
}
/// <summary>
/// Validate a DipSwitch
/// </summary>
private static void Validate(Models.Listxml.DipSwitch? dipswitch)
{
Assert.NotNull(dipswitch);
Assert.Equal("XXXXXX", dipswitch.Name);
Assert.Equal("XXXXXX", dipswitch.Tag);
Assert.Equal("XXXXXX", dipswitch.Mask);
Validate(dipswitch.Condition);
Assert.NotNull(dipswitch.DipLocation);
var diplocation = Assert.Single(dipswitch.DipLocation);
Validate(diplocation);
Assert.NotNull(dipswitch.DipValue);
var dipvalue = Assert.Single(dipswitch.DipValue);
Validate(dipvalue);
}
/// <summary>
/// Validate a Condition
/// </summary>
private static void Validate(Models.Listxml.Condition? condition)
{
Assert.NotNull(condition);
Assert.Equal("XXXXXX", condition.Tag);
Assert.Equal("XXXXXX", condition.Mask);
Assert.Equal("XXXXXX", condition.Relation);
Assert.Equal("XXXXXX", condition.Value);
}
/// <summary>
/// Validate a DipLocation
/// </summary>
private static void Validate(Models.Listxml.DipLocation? diplocation)
{
Assert.NotNull(diplocation);
Assert.Equal("XXXXXX", diplocation.Name);
Assert.Equal("XXXXXX", diplocation.Number);
Assert.Equal("XXXXXX", diplocation.Inverted);
}
/// <summary>
/// Validate a DipValue
/// </summary>
private static void Validate(Models.Listxml.DipValue? dipvalue)
{
Assert.NotNull(dipvalue);
Assert.Equal("XXXXXX", dipvalue.Name);
Assert.Equal("XXXXXX", dipvalue.Value);
Assert.Equal("XXXXXX", dipvalue.Default);
Validate(dipvalue.Condition);
}
/// <summary>
/// Validate a Configuration
/// </summary>
private static void Validate(Models.Listxml.Configuration? configuration)
{
Assert.NotNull(configuration);
Assert.Equal("XXXXXX", configuration.Name);
Assert.Equal("XXXXXX", configuration.Tag);
Assert.Equal("XXXXXX", configuration.Mask);
Validate(configuration.Condition);
Assert.NotNull(configuration.ConfLocation);
var conflocation = Assert.Single(configuration.ConfLocation);
Validate(conflocation);
Assert.NotNull(configuration.ConfSetting);
var confsetting = Assert.Single(configuration.ConfSetting);
Validate(confsetting);
}
/// <summary>
/// Validate a ConfLocation
/// </summary>
private static void Validate(Models.Listxml.ConfLocation? conflocation)
{
Assert.NotNull(conflocation);
Assert.Equal("XXXXXX", conflocation.Name);
Assert.Equal("XXXXXX", conflocation.Number);
Assert.Equal("XXXXXX", conflocation.Inverted);
}
/// <summary>
/// Validate a ConfSetting
/// </summary>
private static void Validate(Models.Listxml.ConfSetting? confsetting)
{
Assert.NotNull(confsetting);
Assert.Equal("XXXXXX", confsetting.Name);
Assert.Equal("XXXXXX", confsetting.Value);
Assert.Equal("XXXXXX", confsetting.Default);
Validate(confsetting.Condition);
}
/// <summary>
/// Validate a Port
/// </summary>
private static void Validate(Models.Listxml.Port? port)
{
Assert.NotNull(port);
Assert.Equal("XXXXXX", port.Tag);
Assert.NotNull(port.Analog);
var analog = Assert.Single(port.Analog);
Validate(analog);
}
/// <summary>
/// Validate a Analog
/// </summary>
private static void Validate(Models.Listxml.Analog? analog)
{
Assert.NotNull(analog);
Assert.Equal("XXXXXX", analog.Mask);
}
/// <summary>
/// Validate a Adjuster
/// </summary>
private static void Validate(Models.Listxml.Adjuster? adjuster)
{
Assert.NotNull(adjuster);
Assert.Equal("XXXXXX", adjuster.Name);
Assert.Equal("XXXXXX", adjuster.Default);
Validate(adjuster.Condition);
}
/// <summary>
/// Validate a Driver
/// </summary>
private static void Validate(Models.Listxml.Driver? driver)
{
Assert.NotNull(driver);
Assert.Equal("XXXXXX", driver.Status);
Assert.Equal("XXXXXX", driver.Color);
Assert.Equal("XXXXXX", driver.Sound);
Assert.Equal("XXXXXX", driver.PaletteSize);
Assert.Equal("XXXXXX", driver.Emulation);
Assert.Equal("XXXXXX", driver.Cocktail);
Assert.Equal("XXXXXX", driver.SaveState);
Assert.Equal("XXXXXX", driver.RequiresArtwork);
Assert.Equal("XXXXXX", driver.Unofficial);
Assert.Equal("XXXXXX", driver.NoSoundHardware);
Assert.Equal("XXXXXX", driver.Incomplete);
}
/// <summary>
/// Validate a Feature
/// </summary>
private static void Validate(Models.Listxml.Feature? feature)
{
Assert.NotNull(feature);
Assert.Equal("XXXXXX", feature.Type);
Assert.Equal("XXXXXX", feature.Status);
Assert.Equal("XXXXXX", feature.Overall);
}
/// <summary>
/// Validate a Device
/// </summary>
private static void Validate(Models.Listxml.Device? device)
{
Assert.NotNull(device);
Assert.Equal("XXXXXX", device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
Assert.Equal("XXXXXX", device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);
Assert.NotNull(device.Extension);
var extension = Assert.Single(device.Extension);
Validate(extension);
}
/// <summary>
/// Validate a Instance
/// </summary>
private static void Validate(Models.Listxml.Instance? instance)
{
Assert.NotNull(instance);
Assert.Equal("XXXXXX", instance.Name);
Assert.Equal("XXXXXX", instance.BriefName);
}
/// <summary>
/// Validate a Extension
/// </summary>
private static void Validate(Models.Listxml.Extension? extension)
{
Assert.NotNull(extension);
Assert.Equal("XXXXXX", extension.Name);
}
/// <summary>
/// Validate a Slot
/// </summary>
private static void Validate(Models.Listxml.Slot? slot)
{
Assert.NotNull(slot);
Assert.Equal("XXXXXX", slot.Name);
Assert.NotNull(slot.SlotOption);
var slotoption = Assert.Single(slot.SlotOption);
Validate(slotoption);
}
/// <summary>
/// Validate a SlotOption
/// </summary>
private static void Validate(Models.Listxml.SlotOption? slotoption)
{
Assert.NotNull(slotoption);
Assert.Equal("XXXXXX", slotoption.Name);
Assert.Equal("XXXXXX", slotoption.DevName);
Assert.Equal("XXXXXX", slotoption.Default);
}
/// <summary>
/// Validate a SoftwareList
/// </summary>
private static void Validate(Models.Listxml.SoftwareList? softwarelist)
{
Assert.NotNull(softwarelist);
Assert.Equal("XXXXXX", softwarelist.Tag);
Assert.Equal("XXXXXX", softwarelist.Name);
Assert.Equal("XXXXXX", softwarelist.Status);
Assert.Equal("XXXXXX", softwarelist.Filter);
}
/// <summary>
/// Validate a RamOption
/// </summary>
private static void Validate(Models.Listxml.RamOption? ramoption)
{
Assert.NotNull(ramoption);
Assert.Equal("XXXXXX", ramoption.Name);
Assert.Equal("XXXXXX", ramoption.Default);
Assert.Equal("XXXXXX", ramoption.Content);
}
}
}

View File

@@ -0,0 +1,545 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class LogiqxTests
{
[Fact]
public void RoundTripGameTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Logiqx();
// Build the data
Models.Logiqx.Datafile df = Build(game: true);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(df);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Logiqx.Datafile? newDf = serializer.Deserialize(metadata, game: true);
// Validate the data
Assert.NotNull(newDf);
Assert.Equal("XXXXXX", newDf.Build);
Assert.Equal("XXXXXX", newDf.Debug);
Assert.Equal("XXXXXX", newDf.SchemaLocation);
Validate(newDf.Header);
Assert.NotNull(newDf.Game);
var newGame = Assert.Single(newDf.Game);
Validate(newGame);
// TODO: Unsupported
Assert.Null(newDf.Dir);
}
[Fact]
public void RoundTripMachineTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.Logiqx();
// Build the data
Models.Logiqx.Datafile df = Build(game: false);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(df);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Logiqx.Datafile? newDf = serializer.Deserialize(metadata, game: false);
// Validate the data
Assert.NotNull(newDf);
Assert.Equal("XXXXXX", newDf.Build);
Assert.Equal("XXXXXX", newDf.Debug);
Assert.Equal("XXXXXX", newDf.SchemaLocation);
Validate(newDf.Header);
Assert.NotNull(newDf.Game);
var newGame = Assert.Single(newDf.Game);
Validate(newGame);
// TODO: Unsupported
Assert.Null(newDf.Dir);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.Logiqx.Datafile Build(bool game)
{
var clrmamepro = new Models.Logiqx.ClrMamePro
{
Header = "XXXXXX",
ForceMerging = "XXXXXX",
ForceNodump = "XXXXXX",
ForcePacking = "XXXXXX",
};
var romcenter = new Models.Logiqx.RomCenter
{
Plugin = "XXXXXX",
RomMode = "XXXXXX",
BiosMode = "XXXXXX",
SampleMode = "XXXXXX",
LockRomMode = "XXXXXX",
LockBiosMode = "XXXXXX",
LockSampleMode = "XXXXXX",
};
var header = new Models.Logiqx.Header
{
Id = "XXXXXX",
Name = "XXXXXX",
Description = "XXXXXX",
RootDir = "XXXXXX",
Category = "XXXXXX",
Version = "XXXXXX",
Date = "XXXXXX",
Author = "XXXXXX",
Email = "XXXXXX",
Homepage = "XXXXXX",
Url = "XXXXXX",
Comment = "XXXXXX",
Type = "XXXXXX",
ClrMamePro = clrmamepro,
RomCenter = romcenter,
};
var trurip = new Models.Logiqx.Trurip
{
TitleID = "XXXXXX",
Publisher = "XXXXXX",
Developer = "XXXXXX",
Year = "XXXXXX",
Genre = "XXXXXX",
Subgenre = "XXXXXX",
Ratings = "XXXXXX",
Score = "XXXXXX",
Players = "XXXXXX",
Enabled = "XXXXXX",
CRC = "XXXXXX",
Source = "XXXXXX",
CloneOf = "XXXXXX",
RelatedTo = "XXXXXX",
};
var release = new Models.Logiqx.Release
{
Name = "XXXXXX",
Region = "XXXXXX",
Language = "XXXXXX",
Date = "XXXXXX",
Default = "XXXXXX",
};
var biosset = new Models.Logiqx.BiosSet
{
Name = "XXXXXX",
Description = "XXXXXX",
Default = "XXXXXX",
};
var rom = new Models.Logiqx.Rom
{
Name = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
SHA256 = "XXXXXX",
SHA384 = "XXXXXX",
SHA512 = "XXXXXX",
SpamSum = "XXXXXX",
xxHash364 = "XXXXXX",
xxHash3128 = "XXXXXX",
Merge = "XXXXXX",
Status = "XXXXXX",
Serial = "XXXXXX",
Header = "XXXXXX",
Date = "XXXXXX",
Inverted = "XXXXXX",
MIA = "XXXXXX",
};
var disk = new Models.Logiqx.Disk
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Status = "XXXXXX",
Region = "XXXXXX",
};
var media = new Models.Logiqx.Media
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
SHA256 = "XXXXXX",
SpamSum = "XXXXXX",
};
var deviceRef = new Models.Logiqx.DeviceRef
{
Name = "XXXXXX",
};
var sample = new Models.Logiqx.Sample
{
Name = "XXXXXX",
};
var archive = new Models.Logiqx.Archive
{
Name = "XXXXXX",
};
var driver = new Models.Logiqx.Driver
{
Status = "XXXXXX",
Emulation = "XXXXXX",
Cocktail = "XXXXXX",
SaveState = "XXXXXX",
RequiresArtwork = "XXXXXX",
Unofficial = "XXXXXX",
NoSoundHardware = "XXXXXX",
Incomplete = "XXXXXX",
};
var softwarelist = new Models.Logiqx.SoftwareList
{
Tag = "XXXXXX",
Name = "XXXXXX",
Status = "XXXXXX",
Filter = "XXXXXX",
};
Models.Logiqx.GameBase gameBase = game
? new Models.Logiqx.Game()
: new Models.Logiqx.Machine();
gameBase.Name = "XXXXXX";
gameBase.SourceFile = "XXXXXX";
gameBase.IsBios = "XXXXXX";
gameBase.IsDevice = "XXXXXX";
gameBase.IsMechanical = "XXXXXX";
gameBase.CloneOf = "XXXXXX";
gameBase.RomOf = "XXXXXX";
gameBase.SampleOf = "XXXXXX";
gameBase.Board = "XXXXXX";
gameBase.RebuildTo = "XXXXXX";
gameBase.Id = "XXXXXX";
gameBase.CloneOfId = "XXXXXX";
gameBase.Runnable = "XXXXXX";
gameBase.Comment = ["XXXXXX"];
gameBase.Description = "XXXXXX";
gameBase.Year = "XXXXXX";
gameBase.Manufacturer = "XXXXXX";
gameBase.Publisher = "XXXXXX";
gameBase.Category = ["XXXXXX"];
gameBase.Trurip = trurip;
gameBase.Release = [release];
gameBase.BiosSet = [biosset];
gameBase.Rom = [rom];
gameBase.Disk = [disk];
gameBase.Media = [media];
gameBase.DeviceRef = [deviceRef];
gameBase.Sample = [sample];
gameBase.Archive = [archive];
gameBase.Driver = driver;
gameBase.SoftwareList = [softwarelist];
return new Models.Logiqx.Datafile
{
Build = "XXXXXX",
Debug = "XXXXXX",
SchemaLocation = "XXXXXX",
Header = header,
Game = [gameBase],
// Dir = [dir], // TODO: Unsupported
};
}
/// <summary>
/// Validate a Header
/// </summary>
private static void Validate(Models.Logiqx.Header? header)
{
Assert.NotNull(header);
Assert.Equal("XXXXXX", header.Id);
Assert.Equal("XXXXXX", header.Name);
Assert.Equal("XXXXXX", header.Description);
Assert.Equal("XXXXXX", header.RootDir);
Assert.Equal("XXXXXX", header.Category);
Assert.Equal("XXXXXX", header.Version);
Assert.Equal("XXXXXX", header.Date);
Assert.Equal("XXXXXX", header.Author);
Assert.Equal("XXXXXX", header.Email);
Assert.Equal("XXXXXX", header.Homepage);
Assert.Equal("XXXXXX", header.Url);
Assert.Equal("XXXXXX", header.Comment);
Assert.Equal("XXXXXX", header.Type);
Validate(header.ClrMamePro);
Validate(header.RomCenter);
}
/// <summary>
/// Validate a ClrMamePro
/// </summary>
private static void Validate(Models.Logiqx.ClrMamePro? cmp)
{
Assert.NotNull(cmp);
Assert.Equal("XXXXXX", cmp.Header);
Assert.Equal("XXXXXX", cmp.ForceMerging);
Assert.Equal("XXXXXX", cmp.ForceNodump);
Assert.Equal("XXXXXX", cmp.ForcePacking);
}
/// <summary>
/// Validate a RomCenter
/// </summary>
private static void Validate(Models.Logiqx.RomCenter? rc)
{
Assert.NotNull(rc);
Assert.Equal("XXXXXX", rc.Plugin);
Assert.Equal("XXXXXX", rc.RomMode);
Assert.Equal("XXXXXX", rc.BiosMode);
Assert.Equal("XXXXXX", rc.SampleMode);
Assert.Equal("XXXXXX", rc.LockRomMode);
Assert.Equal("XXXXXX", rc.LockBiosMode);
Assert.Equal("XXXXXX", rc.LockSampleMode);
}
/// <summary>
/// Validate a GameBase
/// </summary>
private static void Validate(Models.Logiqx.GameBase? gb)
{
Assert.NotNull(gb);
Assert.Equal("XXXXXX", gb.Name);
Assert.Equal("XXXXXX", gb.SourceFile);
Assert.Equal("XXXXXX", gb.IsBios);
Assert.Equal("XXXXXX", gb.IsDevice);
Assert.Equal("XXXXXX", gb.IsMechanical);
Assert.Equal("XXXXXX", gb.CloneOf);
Assert.Equal("XXXXXX", gb.RomOf);
Assert.Equal("XXXXXX", gb.SampleOf);
Assert.Equal("XXXXXX", gb.Board);
Assert.Equal("XXXXXX", gb.RebuildTo);
Assert.Equal("XXXXXX", gb.Id);
Assert.Equal("XXXXXX", gb.CloneOfId);
Assert.Equal("XXXXXX", gb.Runnable);
Assert.NotNull(gb.Comment);
string comment = Assert.Single(gb.Comment);
Assert.Equal("XXXXXX", comment);
Assert.Equal("XXXXXX", gb.Description);
Assert.Equal("XXXXXX", gb.Year);
Assert.Equal("XXXXXX", gb.Manufacturer);
Assert.Equal("XXXXXX", gb.Publisher);
Assert.NotNull(gb.Category);
string category = Assert.Single(gb.Category);
Assert.Equal("XXXXXX", category);
Validate(gb.Trurip);
Assert.NotNull(gb.Release);
var release = Assert.Single(gb.Release);
Validate(release);
Assert.NotNull(gb.BiosSet);
var biosset = Assert.Single(gb.BiosSet);
Validate(biosset);
Assert.NotNull(gb.Rom);
var rom = Assert.Single(gb.Rom);
Validate(rom);
Assert.NotNull(gb.Disk);
var disk = Assert.Single(gb.Disk);
Validate(disk);
Assert.NotNull(gb.Media);
var media = Assert.Single(gb.Media);
Validate(media);
Assert.NotNull(gb.DeviceRef);
var deviceref = Assert.Single(gb.DeviceRef);
Validate(deviceref);
Assert.NotNull(gb.Sample);
var sample = Assert.Single(gb.Sample);
Validate(sample);
Assert.NotNull(gb.Archive);
var archive = Assert.Single(gb.Archive);
Validate(archive);
Validate(gb.Driver);
Assert.NotNull(gb.SoftwareList);
var softwarelist = Assert.Single(gb.SoftwareList);
Validate(softwarelist);
}
/// <summary>
/// Validate a Trurip
/// </summary>
private static void Validate(Models.Logiqx.Trurip? trurip)
{
Assert.NotNull(trurip);
Assert.Equal("XXXXXX", trurip.TitleID);
Assert.Equal("XXXXXX", trurip.Publisher);
Assert.Equal("XXXXXX", trurip.Developer);
Assert.Equal("XXXXXX", trurip.Year);
Assert.Equal("XXXXXX", trurip.Genre);
Assert.Equal("XXXXXX", trurip.Subgenre);
Assert.Equal("XXXXXX", trurip.Ratings);
Assert.Equal("XXXXXX", trurip.Score);
Assert.Equal("XXXXXX", trurip.Players);
Assert.Equal("XXXXXX", trurip.Enabled);
Assert.Equal("XXXXXX", trurip.CRC);
Assert.Equal("XXXXXX", trurip.Source);
Assert.Equal("XXXXXX", trurip.CloneOf);
Assert.Equal("XXXXXX", trurip.RelatedTo);
}
/// <summary>
/// Validate a Release
/// </summary>
private static void Validate(Models.Logiqx.Release? release)
{
Assert.NotNull(release);
Assert.Equal("XXXXXX", release.Name);
Assert.Equal("XXXXXX", release.Region);
Assert.Equal("XXXXXX", release.Language);
Assert.Equal("XXXXXX", release.Date);
Assert.Equal("XXXXXX", release.Default);
}
/// <summary>
/// Validate a BiosSet
/// </summary>
private static void Validate(Models.Logiqx.BiosSet? biosset)
{
Assert.NotNull(biosset);
Assert.Equal("XXXXXX", biosset.Name);
Assert.Equal("XXXXXX", biosset.Description);
Assert.Equal("XXXXXX", biosset.Default);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.Logiqx.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX", rom.MD5);
Assert.Equal("XXXXXX", rom.SHA1);
Assert.Equal("XXXXXX", rom.SHA256);
Assert.Equal("XXXXXX", rom.SHA384);
Assert.Equal("XXXXXX", rom.SHA512);
Assert.Equal("XXXXXX", rom.SpamSum);
Assert.Equal("XXXXXX", rom.xxHash364);
Assert.Equal("XXXXXX", rom.xxHash3128);
Assert.Equal("XXXXXX", rom.Merge);
Assert.Equal("XXXXXX", rom.Status);
Assert.Equal("XXXXXX", rom.Serial);
Assert.Equal("XXXXXX", rom.Header);
Assert.Equal("XXXXXX", rom.Date);
Assert.Equal("XXXXXX", rom.Inverted);
Assert.Equal("XXXXXX", rom.MIA);
}
/// <summary>
/// Validate a Disk
/// </summary>
private static void Validate(Models.Logiqx.Disk? disk)
{
Assert.NotNull(disk);
Assert.Equal("XXXXXX", disk.Name);
Assert.Equal("XXXXXX", disk.MD5);
Assert.Equal("XXXXXX", disk.SHA1);
Assert.Equal("XXXXXX", disk.Merge);
Assert.Equal("XXXXXX", disk.Status);
Assert.Equal("XXXXXX", disk.Region);
}
/// <summary>
/// Validate a Media
/// </summary>
private static void Validate(Models.Logiqx.Media? media)
{
Assert.NotNull(media);
Assert.Equal("XXXXXX", media.Name);
Assert.Equal("XXXXXX", media.MD5);
Assert.Equal("XXXXXX", media.SHA1);
Assert.Equal("XXXXXX", media.SHA256);
Assert.Equal("XXXXXX", media.SpamSum);
}
/// <summary>
/// Validate a DeviceRef
/// </summary>
private static void Validate(Models.Logiqx.DeviceRef? deviceref)
{
Assert.NotNull(deviceref);
Assert.Equal("XXXXXX", deviceref.Name);
}
/// <summary>
/// Validate a Sample
/// </summary>
private static void Validate(Models.Logiqx.Sample? sample)
{
Assert.NotNull(sample);
Assert.Equal("XXXXXX", sample.Name);
}
/// <summary>
/// Validate a Archive
/// </summary>
private static void Validate(Models.Logiqx.Archive? archive)
{
Assert.NotNull(archive);
Assert.Equal("XXXXXX", archive.Name);
}
/// <summary>
/// Validate a Driver
/// </summary>
private static void Validate(Models.Logiqx.Driver? driver)
{
Assert.NotNull(driver);
Assert.Equal("XXXXXX", driver.Status);
Assert.Equal("XXXXXX", driver.Emulation);
Assert.Equal("XXXXXX", driver.Cocktail);
Assert.Equal("XXXXXX", driver.SaveState);
Assert.Equal("XXXXXX", driver.RequiresArtwork);
Assert.Equal("XXXXXX", driver.Unofficial);
Assert.Equal("XXXXXX", driver.NoSoundHardware);
Assert.Equal("XXXXXX", driver.Incomplete);
}
/// <summary>
/// Validate a SoftwareList
/// </summary>
private static void Validate(Models.Logiqx.SoftwareList? softwarelist)
{
Assert.NotNull(softwarelist);
Assert.Equal("XXXXXX", softwarelist.Tag);
Assert.Equal("XXXXXX", softwarelist.Name);
Assert.Equal("XXXXXX", softwarelist.Status);
Assert.Equal("XXXXXX", softwarelist.Filter);
}
}
}

View File

@@ -0,0 +1,872 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class M1Tests
{
[Fact]
public void RoundTripGameTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.M1();
// Build the data
Models.Listxml.M1 m1 = Build(game: true);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(m1);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Listxml.M1? newM1 = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newM1);
Assert.Equal("XXXXXX", newM1.Version);
Assert.NotNull(newM1.Game);
var newGame = Assert.Single(newM1.Game);
Validate(newGame);
}
[Fact]
public void RoundTripMachineTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.M1();
// Build the data
Models.Listxml.M1 m1 = Build(game: false);
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(m1);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Listxml.M1? newM1 = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newM1);
Assert.Equal("XXXXXX", newM1.Version);
Assert.NotNull(newM1.Game);
var newGame = Assert.Single(newM1.Game);
Validate(newGame);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.Listxml.M1 Build(bool game)
{
var biosset = new Models.Listxml.BiosSet
{
Name = "XXXXXX",
Description = "XXXXXX",
Default = "XXXXXX",
};
var rom = new Models.Listxml.Rom
{
Name = "XXXXXX",
Bios = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Region = "XXXXXX",
Offset = "XXXXXX",
Status = "XXXXXX",
Optional = "XXXXXX",
Dispose = "XXXXXX",
SoundOnly = "XXXXXX",
};
var disk = new Models.Listxml.Disk
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Region = "XXXXXX",
Index = "XXXXXX",
Writable = "XXXXXX",
Status = "XXXXXX",
Optional = "XXXXXX",
};
var deviceref = new Models.Listxml.DeviceRef
{
Name = "XXXXXX",
};
var sample = new Models.Listxml.Sample
{
Name = "XXXXXX",
};
var chip = new Models.Listxml.Chip
{
Name = "XXXXXX",
Tag = "XXXXXX",
Type = "XXXXXX",
SoundOnly = "XXXXXX",
Clock = "XXXXXX",
};
var display = new Models.Listxml.Display
{
Tag = "XXXXXX",
Type = "XXXXXX",
Rotate = "XXXXXX",
FlipX = "XXXXXX",
Width = "XXXXXX",
Height = "XXXXXX",
Refresh = "XXXXXX",
PixClock = "XXXXXX",
HTotal = "XXXXXX",
HBEnd = "XXXXXX",
HBStart = "XXXXXX",
VTotal = "XXXXXX",
VBEnd = "XXXXXX",
VBStart = "XXXXXX",
};
var video = new Models.Listxml.Video
{
Screen = "XXXXXX",
Orientation = "XXXXXX",
Width = "XXXXXX",
Height = "XXXXXX",
AspectX = "XXXXXX",
AspectY = "XXXXXX",
Refresh = "XXXXXX",
};
var sound = new Models.Listxml.Sound
{
Channels = "XXXXXX",
};
var control = new Models.Listxml.Control
{
Type = "XXXXXX",
Player = "XXXXXX",
Buttons = "XXXXXX",
ReqButtons = "XXXXXX",
Minimum = "XXXXXX",
Maximum = "XXXXXX",
Sensitivity = "XXXXXX",
KeyDelta = "XXXXXX",
Reverse = "XXXXXX",
Ways = "XXXXXX",
Ways2 = "XXXXXX",
Ways3 = "XXXXXX",
};
var input = new Models.Listxml.Input
{
Service = "XXXXXX",
Tilt = "XXXXXX",
Players = "XXXXXX",
//ControlAttr = "XXXXXX", // Mututally exclusive with input.Control
Buttons = "XXXXXX",
Coins = "XXXXXX",
Control = [control],
};
var condition = new Models.Listxml.Condition
{
Tag = "XXXXXX",
Mask = "XXXXXX",
Relation = "XXXXXX",
Value = "XXXXXX",
};
var diplocation = new Models.Listxml.DipLocation
{
Name = "XXXXXX",
Number = "XXXXXX",
Inverted = "XXXXXX",
};
var dipvalue = new Models.Listxml.DipValue
{
Name = "XXXXXX",
Value = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var dipswitch = new Models.Listxml.DipSwitch
{
Name = "XXXXXX",
Tag = "XXXXXX",
Mask = "XXXXXX",
Condition = condition,
DipLocation = [diplocation],
DipValue = [dipvalue],
};
var conflocation = new Models.Listxml.ConfLocation
{
Name = "XXXXXX",
Number = "XXXXXX",
Inverted = "XXXXXX",
};
var confsetting = new Models.Listxml.ConfSetting
{
Name = "XXXXXX",
Value = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var configuration = new Models.Listxml.Configuration
{
Name = "XXXXXX",
Tag = "XXXXXX",
Mask = "XXXXXX",
Condition = condition,
ConfLocation = [conflocation],
ConfSetting = [confsetting],
};
var analog = new Models.Listxml.Analog
{
Mask = "XXXXXX",
};
var port = new Models.Listxml.Port
{
Tag = "XXXXXX",
Analog = [analog],
};
var adjuster = new Models.Listxml.Adjuster
{
Name = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var driver = new Models.Listxml.Driver
{
Status = "XXXXXX",
Color = "XXXXXX",
Sound = "XXXXXX",
PaletteSize = "XXXXXX",
Emulation = "XXXXXX",
Cocktail = "XXXXXX",
SaveState = "XXXXXX",
RequiresArtwork = "XXXXXX",
Unofficial = "XXXXXX",
NoSoundHardware = "XXXXXX",
Incomplete = "XXXXXX",
};
var feature = new Models.Listxml.Feature
{
Type = "XXXXXX",
Status = "XXXXXX",
Overall = "XXXXXX",
};
var instance = new Models.Listxml.Instance
{
Name = "XXXXXX",
BriefName = "XXXXXX",
};
var extension = new Models.Listxml.Extension
{
Name = "XXXXXX",
};
var device = new Models.Listxml.Device
{
Type = "XXXXXX",
Tag = "XXXXXX",
FixedImage = "XXXXXX",
Mandatory = "XXXXXX",
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
};
var slotOption = new Models.Listxml.SlotOption
{
Name = "XXXXXX",
DevName = "XXXXXX",
Default = "XXXXXX",
};
var slot = new Models.Listxml.Slot
{
Name = "XXXXXX",
SlotOption = [slotOption],
};
var softwarelist = new Models.Listxml.SoftwareList
{
Tag = "XXXXXX",
Name = "XXXXXX",
Status = "XXXXXX",
Filter = "XXXXXX",
};
var ramoption = new Models.Listxml.RamOption
{
Name = "XXXXXX",
Default = "XXXXXX",
Content = "XXXXXX",
};
Models.Listxml.GameBase gameBase = game
? new Models.Listxml.Game()
: new Models.Listxml.Machine();
gameBase.Name = "XXXXXX";
gameBase.SourceFile = "XXXXXX";
gameBase.IsBios = "XXXXXX";
gameBase.IsDevice = "XXXXXX";
gameBase.IsMechanical = "XXXXXX";
gameBase.Runnable = "XXXXXX";
gameBase.CloneOf = "XXXXXX";
gameBase.RomOf = "XXXXXX";
gameBase.SampleOf = "XXXXXX";
gameBase.Description = "XXXXXX";
gameBase.Year = "XXXXXX";
gameBase.Manufacturer = "XXXXXX";
gameBase.History = "XXXXXX";
gameBase.BiosSet = [biosset];
gameBase.Rom = [rom];
gameBase.Disk = [disk];
gameBase.DeviceRef = [deviceref];
gameBase.Sample = [sample];
gameBase.Chip = [chip];
gameBase.Display = [display];
gameBase.Video = [video];
gameBase.Sound = sound;
gameBase.Input = input;
gameBase.DipSwitch = [dipswitch];
gameBase.Configuration = [configuration];
gameBase.Port = [port];
gameBase.Adjuster = [adjuster];
gameBase.Driver = driver;
gameBase.Feature = [feature];
gameBase.Device = [device];
gameBase.Slot = [slot];
gameBase.SoftwareList = [softwarelist];
gameBase.RamOption = [ramoption];
return new Models.Listxml.M1
{
Version = "XXXXXX",
Game = [gameBase],
};
}
/// <summary>
/// Validate a GameBase
/// </summary>
private static void Validate(Models.Listxml.GameBase? gb)
{
Assert.NotNull(gb);
Assert.Equal("XXXXXX", gb.Name);
Assert.Equal("XXXXXX", gb.SourceFile);
Assert.Equal("XXXXXX", gb.IsBios);
Assert.Equal("XXXXXX", gb.IsDevice);
Assert.Equal("XXXXXX", gb.IsMechanical);
Assert.Equal("XXXXXX", gb.Runnable);
Assert.Equal("XXXXXX", gb.CloneOf);
Assert.Equal("XXXXXX", gb.RomOf);
Assert.Equal("XXXXXX", gb.SampleOf);
Assert.Equal("XXXXXX", gb.Description);
Assert.Equal("XXXXXX", gb.Year);
Assert.Equal("XXXXXX", gb.Manufacturer);
Assert.Equal("XXXXXX", gb.History);
Assert.NotNull(gb.BiosSet);
var biosset = Assert.Single(gb.BiosSet);
Validate(biosset);
Assert.NotNull(gb.Rom);
var rom = Assert.Single(gb.Rom);
Validate(rom);
Assert.NotNull(gb.Disk);
var disk = Assert.Single(gb.Disk);
Validate(disk);
Assert.NotNull(gb.DeviceRef);
var deviceref = Assert.Single(gb.DeviceRef);
Validate(deviceref);
Assert.NotNull(gb.Sample);
var sample = Assert.Single(gb.Sample);
Validate(sample);
Assert.NotNull(gb.Chip);
var chip = Assert.Single(gb.Chip);
Validate(chip);
Assert.NotNull(gb.Display);
var display = Assert.Single(gb.Display);
Validate(display);
Assert.NotNull(gb.Video);
var video = Assert.Single(gb.Video);
Validate(video);
Validate(gb.Sound);
Validate(gb.Input);
Assert.NotNull(gb.DipSwitch);
var dipswitch = Assert.Single(gb.DipSwitch);
Validate(dipswitch);
Assert.NotNull(gb.Configuration);
var configuration = Assert.Single(gb.Configuration);
Validate(configuration);
Assert.NotNull(gb.Port);
var port = Assert.Single(gb.Port);
Validate(port);
Assert.NotNull(gb.Adjuster);
var adjuster = Assert.Single(gb.Adjuster);
Validate(adjuster);
Validate(gb.Driver);
Assert.NotNull(gb.Feature);
var feature = Assert.Single(gb.Feature);
Validate(feature);
Assert.NotNull(gb.Device);
var device = Assert.Single(gb.Device);
Validate(device);
Assert.NotNull(gb.Slot);
var slot = Assert.Single(gb.Slot);
Validate(slot);
Assert.NotNull(gb.SoftwareList);
var softwarelist = Assert.Single(gb.SoftwareList);
Validate(softwarelist);
Assert.NotNull(gb.RamOption);
var ramoption = Assert.Single(gb.RamOption);
Validate(ramoption);
}
/// <summary>
/// Validate a BiosSet
/// </summary>
private static void Validate(Models.Listxml.BiosSet? biosset)
{
Assert.NotNull(biosset);
Assert.Equal("XXXXXX", biosset.Name);
Assert.Equal("XXXXXX", biosset.Description);
Assert.Equal("XXXXXX", biosset.Default);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.Listxml.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Bios);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX", rom.SHA1);
Assert.Equal("XXXXXX", rom.Merge);
Assert.Equal("XXXXXX", rom.Region);
Assert.Equal("XXXXXX", rom.Offset);
Assert.Equal("XXXXXX", rom.Status);
Assert.Equal("XXXXXX", rom.Optional);
Assert.Equal("XXXXXX", rom.Dispose);
Assert.Equal("XXXXXX", rom.SoundOnly);
}
/// <summary>
/// Validate a Disk
/// </summary>
private static void Validate(Models.Listxml.Disk? disk)
{
Assert.NotNull(disk);
Assert.Equal("XXXXXX", disk.Name);
Assert.Equal("XXXXXX", disk.MD5);
Assert.Equal("XXXXXX", disk.SHA1);
Assert.Equal("XXXXXX", disk.Merge);
Assert.Equal("XXXXXX", disk.Region);
Assert.Equal("XXXXXX", disk.Index);
Assert.Equal("XXXXXX", disk.Writable);
Assert.Equal("XXXXXX", disk.Status);
Assert.Equal("XXXXXX", disk.Optional);
}
/// <summary>
/// Validate a DeviceRef
/// </summary>
private static void Validate(Models.Listxml.DeviceRef? deviceref)
{
Assert.NotNull(deviceref);
Assert.Equal("XXXXXX", deviceref.Name);
}
/// <summary>
/// Validate a Sample
/// </summary>
private static void Validate(Models.Listxml.Sample? sample)
{
Assert.NotNull(sample);
Assert.Equal("XXXXXX", sample.Name);
}
/// <summary>
/// Validate a Chip
/// </summary>
private static void Validate(Models.Listxml.Chip? chip)
{
Assert.NotNull(chip);
Assert.Equal("XXXXXX", chip.Name);
Assert.Equal("XXXXXX", chip.Tag);
Assert.Equal("XXXXXX", chip.Type);
Assert.Equal("XXXXXX", chip.SoundOnly);
Assert.Equal("XXXXXX", chip.Clock);
}
/// <summary>
/// Validate a Display
/// </summary>
private static void Validate(Models.Listxml.Display? display)
{
Assert.NotNull(display);
Assert.Equal("XXXXXX", display.Tag);
Assert.Equal("XXXXXX", display.Type);
Assert.Equal("XXXXXX", display.Rotate);
Assert.Equal("XXXXXX", display.FlipX);
Assert.Equal("XXXXXX", display.Width);
Assert.Equal("XXXXXX", display.Height);
Assert.Equal("XXXXXX", display.Refresh);
Assert.Equal("XXXXXX", display.PixClock);
Assert.Equal("XXXXXX", display.HTotal);
Assert.Equal("XXXXXX", display.HBEnd);
Assert.Equal("XXXXXX", display.HBStart);
Assert.Equal("XXXXXX", display.VTotal);
Assert.Equal("XXXXXX", display.VBEnd);
Assert.Equal("XXXXXX", display.VBStart);
}
/// <summary>
/// Validate a Video
/// </summary>
private static void Validate(Models.Listxml.Video? video)
{
Assert.NotNull(video);
Assert.Equal("XXXXXX", video.Screen);
Assert.Equal("XXXXXX", video.Orientation);
Assert.Equal("XXXXXX", video.Width);
Assert.Equal("XXXXXX", video.Height);
Assert.Equal("XXXXXX", video.AspectX);
Assert.Equal("XXXXXX", video.AspectY);
Assert.Equal("XXXXXX", video.Refresh);
}
/// <summary>
/// Validate a Sound
/// </summary>
private static void Validate(Models.Listxml.Sound? sound)
{
Assert.NotNull(sound);
Assert.Equal("XXXXXX", sound.Channels);
}
/// <summary>
/// Validate a Input
/// </summary>
private static void Validate(Models.Listxml.Input? input)
{
Assert.NotNull(input);
Assert.Equal("XXXXXX", input.Service);
Assert.Equal("XXXXXX", input.Tilt);
Assert.Equal("XXXXXX", input.Players);
//Assert.Equal("XXXXXX", input.ControlAttr); // Mututally exclusive with input.Control
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.NotNull(input.Control);
var control = Assert.Single(input.Control);
Validate(control);
}
/// <summary>
/// Validate a Control
/// </summary>
private static void Validate(Models.Listxml.Control? control)
{
Assert.NotNull(control);
Assert.Equal("XXXXXX", control.Type);
Assert.Equal("XXXXXX", control.Player);
Assert.Equal("XXXXXX", control.Buttons);
Assert.Equal("XXXXXX", control.ReqButtons);
Assert.Equal("XXXXXX", control.Minimum);
Assert.Equal("XXXXXX", control.Maximum);
Assert.Equal("XXXXXX", control.Sensitivity);
Assert.Equal("XXXXXX", control.KeyDelta);
Assert.Equal("XXXXXX", control.Reverse);
Assert.Equal("XXXXXX", control.Ways);
Assert.Equal("XXXXXX", control.Ways2);
Assert.Equal("XXXXXX", control.Ways3);
}
/// <summary>
/// Validate a DipSwitch
/// </summary>
private static void Validate(Models.Listxml.DipSwitch? dipswitch)
{
Assert.NotNull(dipswitch);
Assert.Equal("XXXXXX", dipswitch.Name);
Assert.Equal("XXXXXX", dipswitch.Tag);
Assert.Equal("XXXXXX", dipswitch.Mask);
Validate(dipswitch.Condition);
Assert.NotNull(dipswitch.DipLocation);
var diplocation = Assert.Single(dipswitch.DipLocation);
Validate(diplocation);
Assert.NotNull(dipswitch.DipValue);
var dipvalue = Assert.Single(dipswitch.DipValue);
Validate(dipvalue);
}
/// <summary>
/// Validate a Condition
/// </summary>
private static void Validate(Models.Listxml.Condition? condition)
{
Assert.NotNull(condition);
Assert.Equal("XXXXXX", condition.Tag);
Assert.Equal("XXXXXX", condition.Mask);
Assert.Equal("XXXXXX", condition.Relation);
Assert.Equal("XXXXXX", condition.Value);
}
/// <summary>
/// Validate a DipLocation
/// </summary>
private static void Validate(Models.Listxml.DipLocation? diplocation)
{
Assert.NotNull(diplocation);
Assert.Equal("XXXXXX", diplocation.Name);
Assert.Equal("XXXXXX", diplocation.Number);
Assert.Equal("XXXXXX", diplocation.Inverted);
}
/// <summary>
/// Validate a DipValue
/// </summary>
private static void Validate(Models.Listxml.DipValue? dipvalue)
{
Assert.NotNull(dipvalue);
Assert.Equal("XXXXXX", dipvalue.Name);
Assert.Equal("XXXXXX", dipvalue.Value);
Assert.Equal("XXXXXX", dipvalue.Default);
Validate(dipvalue.Condition);
}
/// <summary>
/// Validate a Configuration
/// </summary>
private static void Validate(Models.Listxml.Configuration? configuration)
{
Assert.NotNull(configuration);
Assert.Equal("XXXXXX", configuration.Name);
Assert.Equal("XXXXXX", configuration.Tag);
Assert.Equal("XXXXXX", configuration.Mask);
Validate(configuration.Condition);
Assert.NotNull(configuration.ConfLocation);
var conflocation = Assert.Single(configuration.ConfLocation);
Validate(conflocation);
Assert.NotNull(configuration.ConfSetting);
var confsetting = Assert.Single(configuration.ConfSetting);
Validate(confsetting);
}
/// <summary>
/// Validate a ConfLocation
/// </summary>
private static void Validate(Models.Listxml.ConfLocation? conflocation)
{
Assert.NotNull(conflocation);
Assert.Equal("XXXXXX", conflocation.Name);
Assert.Equal("XXXXXX", conflocation.Number);
Assert.Equal("XXXXXX", conflocation.Inverted);
}
/// <summary>
/// Validate a ConfSetting
/// </summary>
private static void Validate(Models.Listxml.ConfSetting? confsetting)
{
Assert.NotNull(confsetting);
Assert.Equal("XXXXXX", confsetting.Name);
Assert.Equal("XXXXXX", confsetting.Value);
Assert.Equal("XXXXXX", confsetting.Default);
Validate(confsetting.Condition);
}
/// <summary>
/// Validate a Port
/// </summary>
private static void Validate(Models.Listxml.Port? port)
{
Assert.NotNull(port);
Assert.Equal("XXXXXX", port.Tag);
Assert.NotNull(port.Analog);
var analog = Assert.Single(port.Analog);
Validate(analog);
}
/// <summary>
/// Validate a Analog
/// </summary>
private static void Validate(Models.Listxml.Analog? analog)
{
Assert.NotNull(analog);
Assert.Equal("XXXXXX", analog.Mask);
}
/// <summary>
/// Validate a Adjuster
/// </summary>
private static void Validate(Models.Listxml.Adjuster? adjuster)
{
Assert.NotNull(adjuster);
Assert.Equal("XXXXXX", adjuster.Name);
Assert.Equal("XXXXXX", adjuster.Default);
Validate(adjuster.Condition);
}
/// <summary>
/// Validate a Driver
/// </summary>
private static void Validate(Models.Listxml.Driver? driver)
{
Assert.NotNull(driver);
Assert.Equal("XXXXXX", driver.Status);
Assert.Equal("XXXXXX", driver.Color);
Assert.Equal("XXXXXX", driver.Sound);
Assert.Equal("XXXXXX", driver.PaletteSize);
Assert.Equal("XXXXXX", driver.Emulation);
Assert.Equal("XXXXXX", driver.Cocktail);
Assert.Equal("XXXXXX", driver.SaveState);
Assert.Equal("XXXXXX", driver.RequiresArtwork);
Assert.Equal("XXXXXX", driver.Unofficial);
Assert.Equal("XXXXXX", driver.NoSoundHardware);
Assert.Equal("XXXXXX", driver.Incomplete);
}
/// <summary>
/// Validate a Feature
/// </summary>
private static void Validate(Models.Listxml.Feature? feature)
{
Assert.NotNull(feature);
Assert.Equal("XXXXXX", feature.Type);
Assert.Equal("XXXXXX", feature.Status);
Assert.Equal("XXXXXX", feature.Overall);
}
/// <summary>
/// Validate a Device
/// </summary>
private static void Validate(Models.Listxml.Device? device)
{
Assert.NotNull(device);
Assert.Equal("XXXXXX", device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
Assert.Equal("XXXXXX", device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);
Assert.NotNull(device.Extension);
var extension = Assert.Single(device.Extension);
Validate(extension);
}
/// <summary>
/// Validate a Instance
/// </summary>
private static void Validate(Models.Listxml.Instance? instance)
{
Assert.NotNull(instance);
Assert.Equal("XXXXXX", instance.Name);
Assert.Equal("XXXXXX", instance.BriefName);
}
/// <summary>
/// Validate a Extension
/// </summary>
private static void Validate(Models.Listxml.Extension? extension)
{
Assert.NotNull(extension);
Assert.Equal("XXXXXX", extension.Name);
}
/// <summary>
/// Validate a Slot
/// </summary>
private static void Validate(Models.Listxml.Slot? slot)
{
Assert.NotNull(slot);
Assert.Equal("XXXXXX", slot.Name);
Assert.NotNull(slot.SlotOption);
var slotoption = Assert.Single(slot.SlotOption);
Validate(slotoption);
}
/// <summary>
/// Validate a SlotOption
/// </summary>
private static void Validate(Models.Listxml.SlotOption? slotoption)
{
Assert.NotNull(slotoption);
Assert.Equal("XXXXXX", slotoption.Name);
Assert.Equal("XXXXXX", slotoption.DevName);
Assert.Equal("XXXXXX", slotoption.Default);
}
/// <summary>
/// Validate a SoftwareList
/// </summary>
private static void Validate(Models.Listxml.SoftwareList? softwarelist)
{
Assert.NotNull(softwarelist);
Assert.Equal("XXXXXX", softwarelist.Tag);
Assert.Equal("XXXXXX", softwarelist.Name);
Assert.Equal("XXXXXX", softwarelist.Status);
Assert.Equal("XXXXXX", softwarelist.Filter);
}
/// <summary>
/// Validate a RamOption
/// </summary>
private static void Validate(Models.Listxml.RamOption? ramoption)
{
Assert.NotNull(ramoption);
Assert.Equal("XXXXXX", ramoption.Name);
Assert.Equal("XXXXXX", ramoption.Default);
Assert.Equal("XXXXXX", ramoption.Content);
}
}
}

View File

@@ -0,0 +1,450 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class OfflineListTests
{
[Fact]
public void RoundTripTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.OfflineList();
// Build the data
Models.OfflineList.Dat dat = Build();
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(dat);
Assert.NotNull(metadata);
// Serialize back to original model
Models.OfflineList.Dat? newDat = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newDat);
Assert.Equal("XXXXXX", newDat.NoNamespaceSchemaLocation);
Validate(newDat.Configuration);
Validate(newDat.Games);
Validate(newDat.GUI);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.OfflineList.Dat Build()
{
var infos = new Models.OfflineList.Infos
{
Title = new Models.OfflineList.Title
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Location = new Models.OfflineList.Location
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Publisher = new Models.OfflineList.Publisher
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
SourceRom = new Models.OfflineList.SourceRom
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
SaveType = new Models.OfflineList.SaveType
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
RomSize = new Models.OfflineList.RomSize
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
ReleaseNumber = new Models.OfflineList.ReleaseNumber
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
ImageNumber = new Models.OfflineList.ImageNumber
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
LanguageNumber = new Models.OfflineList.LanguageNumber
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Comment = new Models.OfflineList.Comment
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
RomCRC = new Models.OfflineList.RomCRC
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Im1CRC = new Models.OfflineList.Im1CRC
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Im2CRC = new Models.OfflineList.Im2CRC
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Languages = new Models.OfflineList.Languages
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
};
var canopen = new Models.OfflineList.CanOpen
{
Extension = ["XXXXXX"],
};
var daturl = new Models.OfflineList.DatUrl
{
FileName = "XXXXXX",
Content = "XXXXXX",
};
var newdat = new Models.OfflineList.NewDat
{
DatVersionUrl = "XXXXXX",
DatUrl = daturl,
ImUrl = "XXXXXX",
};
var find = new Models.OfflineList.Find
{
Operation = "XXXXXX",
Value = "XXXXXX",
Content = "XXXXXX",
};
var to = new Models.OfflineList.To
{
Value = "XXXXXX",
Default = "XXXXXX",
Auto = "XXXXXX",
Find = [find],
};
var search = new Models.OfflineList.Search
{
To = [to],
};
var configuration = new Models.OfflineList.Configuration
{
DatName = "XXXXXX",
ImFolder = "XXXXXX",
DatVersion = "XXXXXX",
System = "XXXXXX",
ScreenshotsWidth = "XXXXXX",
ScreenshotsHeight = "XXXXXX",
Infos = infos,
CanOpen = canopen,
NewDat = newdat,
Search = search,
RomTitle = "XXXXXX",
};
var fileromcrc = new Models.OfflineList.FileRomCRC
{
Extension = "XXXXXX",
Content = "XXXXXX",
};
var files = new Models.OfflineList.Files
{
RomCRC = [fileromcrc],
};
var game = new Models.OfflineList.Game
{
ImageNumber = "XXXXXX",
ReleaseNumber = "XXXXXX",
Title = "XXXXXX",
SaveType = "XXXXXX",
RomSize = "XXXXXX",
Publisher = "XXXXXX",
Location = "XXXXXX",
SourceRom = "XXXXXX",
Language = "XXXXXX",
Files = files,
Im1CRC = "XXXXXX",
Im2CRC = "XXXXXX",
Comment = "XXXXXX",
DuplicateID = "XXXXXX",
};
var games = new Models.OfflineList.Games
{
Game = [game],
};
var image = new Models.OfflineList.Image
{
X = "XXXXXX",
Y = "XXXXXX",
Width = "XXXXXX",
Height = "XXXXXX",
};
var images = new Models.OfflineList.Images
{
Width = "XXXXXX",
Height = "XXXXXX",
Image = [image],
};
var gui = new Models.OfflineList.GUI
{
Images = images,
};
return new Models.OfflineList.Dat
{
NoNamespaceSchemaLocation = "XXXXXX",
Configuration = configuration,
Games = games,
GUI = gui,
};
}
/// <summary>
/// Validate a Configuration
/// </summary>
private static void Validate(Models.OfflineList.Configuration? configuration)
{
Assert.NotNull(configuration);
Assert.Equal("XXXXXX", configuration.DatName);
Assert.Equal("XXXXXX", configuration.ImFolder);
Assert.Equal("XXXXXX", configuration.DatVersion);
Assert.Equal("XXXXXX", configuration.System);
Assert.Equal("XXXXXX", configuration.ScreenshotsWidth);
Assert.Equal("XXXXXX", configuration.ScreenshotsHeight);
Validate(configuration.Infos);
Validate(configuration.CanOpen);
Validate(configuration.NewDat);
Validate(configuration.Search);
Assert.Equal("XXXXXX", configuration.RomTitle);
}
/// <summary>
/// Validate a Infos
/// </summary>
private static void Validate(Models.OfflineList.Infos? infos)
{
Assert.NotNull(infos);
Validate(infos.Title);
Validate(infos.Location);
Validate(infos.Publisher);
Validate(infos.SourceRom);
Validate(infos.SaveType);
Validate(infos.RomSize);
Validate(infos.ReleaseNumber);
Validate(infos.ImageNumber);
Validate(infos.LanguageNumber);
Validate(infos.Comment);
Validate(infos.RomCRC);
Validate(infos.Im1CRC);
Validate(infos.Im2CRC);
Validate(infos.Languages);
}
/// <summary>
/// Validate a InfoBase
/// </summary>
private static void Validate(Models.OfflineList.InfoBase? info)
{
Assert.NotNull(info);
Assert.Equal("XXXXXX", info.Visible);
Assert.Equal("XXXXXX", info.InNamingOption);
Assert.Equal("XXXXXX", info.Default);
}
/// <summary>
/// Validate a CanOpen
/// </summary>
private static void Validate(Models.OfflineList.CanOpen? canopen)
{
Assert.NotNull(canopen);
Assert.NotNull(canopen.Extension);
string extension = Assert.Single(canopen.Extension);
Assert.Equal("XXXXXX", extension);
}
/// <summary>
/// Validate a NewDat
/// </summary>
private static void Validate(Models.OfflineList.NewDat? newdat)
{
Assert.NotNull(newdat);
Assert.Equal("XXXXXX", newdat.DatVersionUrl);
Validate(newdat.DatUrl);
Assert.Equal("XXXXXX", newdat.ImUrl);
}
/// <summary>
/// Validate a DatUrl
/// </summary>
private static void Validate(Models.OfflineList.DatUrl? daturl)
{
Assert.NotNull(daturl);
Assert.Equal("XXXXXX", daturl.FileName);
Assert.Equal("XXXXXX", daturl.Content);
}
/// <summary>
/// Validate a Search
/// </summary>
private static void Validate(Models.OfflineList.Search? search)
{
Assert.NotNull(search);
Assert.NotNull(search.To);
var to = Assert.Single(search.To);
Validate(to);
}
/// <summary>
/// Validate a To
/// </summary>
private static void Validate(Models.OfflineList.To? to)
{
Assert.NotNull(to);
Assert.Equal("XXXXXX", to.Value);
Assert.Equal("XXXXXX", to.Default);
Assert.Equal("XXXXXX", to.Auto);
Assert.NotNull(to.Find);
var find = Assert.Single(to.Find);
Validate(find);
}
/// <summary>
/// Validate a Find
/// </summary>
private static void Validate(Models.OfflineList.Find? find)
{
Assert.NotNull(find);
Assert.Equal("XXXXXX", find.Operation);
Assert.Equal("XXXXXX", find.Value);
Assert.Equal("XXXXXX", find.Content);
}
/// <summary>
/// Validate a Games
/// </summary>
private static void Validate(Models.OfflineList.Games? games)
{
Assert.NotNull(games);
Assert.NotNull(games.Game);
var game = Assert.Single(games.Game);
Validate(game);
}
/// <summary>
/// Validate a Game
/// </summary>
private static void Validate(Models.OfflineList.Game? game)
{
Assert.NotNull(game);
Assert.Equal("XXXXXX", game.ImageNumber);
Assert.Equal("XXXXXX", game.ReleaseNumber);
Assert.Equal("XXXXXX", game.Title);
Assert.Equal("XXXXXX", game.SaveType);
Assert.Equal("0", game.RomSize); // Converted due to filtering
Assert.Equal("XXXXXX", game.Publisher);
Assert.Equal("XXXXXX", game.Location);
Assert.Equal("XXXXXX", game.SourceRom);
Assert.Equal("XXXXXX", game.Language);
Validate(game.Files);
Assert.Equal("XXXXXX", game.Im1CRC);
Assert.Equal("XXXXXX", game.Im2CRC);
Assert.Equal("XXXXXX", game.Comment);
Assert.Equal("XXXXXX", game.DuplicateID);
}
/// <summary>
/// Validate a Files
/// </summary>
private static void Validate(Models.OfflineList.Files? files)
{
Assert.NotNull(files);
Assert.NotNull(files.RomCRC);
var fileromcrc = Assert.Single(files.RomCRC);
Validate(fileromcrc);
}
/// <summary>
/// Validate a FileRomCRC
/// </summary>
private static void Validate(Models.OfflineList.FileRomCRC? fileromcrc)
{
Assert.NotNull(fileromcrc);
Assert.Equal("XXXXXX", fileromcrc.Extension);
Assert.Equal("XXXXXX", fileromcrc.Content);
}
/// <summary>
/// Validate a GUI
/// </summary>
private static void Validate(Models.OfflineList.GUI? gui)
{
Assert.NotNull(gui);
Validate(gui.Images);
}
/// <summary>
/// Validate a Images
/// </summary>
private static void Validate(Models.OfflineList.Images? images)
{
Assert.NotNull(images);
Assert.Equal("XXXXXX", images.Width);
Assert.Equal("XXXXXX", images.Height);
Assert.NotNull(images.Image);
var image = Assert.Single(images.Image);
Validate(image);
}
/// <summary>
/// Validate a Image
/// </summary>
private static void Validate(Models.OfflineList.Image? image)
{
Assert.NotNull(image);
Assert.Equal("XXXXXX", image.X);
Assert.Equal("XXXXXX", image.Y);
Assert.Equal("XXXXXX", image.Width);
Assert.Equal("XXXXXX", image.Height);
}
}
}

View File

@@ -0,0 +1,156 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class OpenMSXTests
{
[Fact]
public void RoundTripTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.OpenMSX();
// Build the data
Models.OpenMSX.SoftwareDb sdb = Build();
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(sdb);
Assert.NotNull(metadata);
// Serialize back to original model
Models.OpenMSX.SoftwareDb? newSdb = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newSdb);
Assert.Equal("XXXXXX", newSdb.Timestamp);
Assert.NotNull(newSdb.Software);
var software = Assert.Single(newSdb.Software);
Validate(software);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.OpenMSX.SoftwareDb Build()
{
var original = new Models.OpenMSX.Original
{
Value = "XXXXXX",
Content = "XXXXXX",
};
var rom = new Models.OpenMSX.Rom
{
Start = "XXXXXX",
Type = "XXXXXX",
Hash = "XXXXXX",
Remark = "XXXXXX",
};
var dump_rom = new Models.OpenMSX.Dump
{
Original = original,
Rom = rom,
};
var megarom = new Models.OpenMSX.MegaRom
{
Start = "XXXXXX",
Type = "XXXXXX",
Hash = "XXXXXX",
Remark = "XXXXXX",
};
var dump_megarom = new Models.OpenMSX.Dump
{
Original = original,
Rom = megarom,
};
var sccpluscart = new Models.OpenMSX.SCCPlusCart
{
Start = "XXXXXX",
Type = "XXXXXX",
Hash = "XXXXXX",
Remark = "XXXXXX",
};
var dump_sccpluscart = new Models.OpenMSX.Dump
{
Original = original,
Rom = sccpluscart,
};
var software = new Models.OpenMSX.Software
{
Title = "XXXXXX",
GenMSXID = "XXXXXX",
System = "XXXXXX",
Company = "XXXXXX",
Year = "XXXXXX",
Country = "XXXXXX",
Dump = [dump_rom, dump_megarom, dump_sccpluscart],
};
return new Models.OpenMSX.SoftwareDb
{
Timestamp = "XXXXXX",
Software = [software],
};
}
/// <summary>
/// Validate a Software
/// </summary>
private static void Validate(Models.OpenMSX.Software? software)
{
Assert.NotNull(software);
Assert.Equal("XXXXXX", software.Title);
Assert.Equal("XXXXXX", software.GenMSXID);
Assert.Equal("XXXXXX", software.System);
Assert.Equal("XXXXXX", software.Company);
Assert.Equal("XXXXXX", software.Year);
Assert.Equal("XXXXXX", software.Country);
Assert.NotNull(software.Dump);
Assert.Equal(3, software.Dump.Length);
foreach (var dump in software.Dump)
{
Validate(dump);
}
}
/// <summary>
/// Validate a Dump
/// </summary>
private static void Validate(Models.OpenMSX.Dump? dump)
{
Assert.NotNull(dump);
Validate(dump.Original);
Validate(dump.Rom);
}
/// <summary>
/// Validate a Original
/// </summary>
private static void Validate(Models.OpenMSX.Original? original)
{
Assert.NotNull(original);
Assert.Equal("XXXXXX", original.Value);
Assert.Equal("XXXXXX", original.Content);
}
/// <summary>
/// Validate a RomBase
/// </summary>
private static void Validate(Models.OpenMSX.RomBase? rombase)
{
Assert.NotNull(rombase);
Assert.Equal("XXXXXX", rombase.Start);
Assert.Equal("XXXXXX", rombase.Type);
Assert.Equal("XXXXXX", rombase.Hash);
Assert.Equal("XXXXXX", rombase.Remark);
}
}
}

View File

@@ -0,0 +1,153 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class RomCenterTests
{
[Fact]
public void RoundTripTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.RomCenter();
// Build the data
Models.RomCenter.MetadataFile mf = Build();
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(mf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.RomCenter.MetadataFile? newMf = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.Credits);
Validate(newMf.Dat);
Validate(newMf.Emulator);
Validate(newMf.Games);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.RomCenter.MetadataFile Build()
{
var credits = new Models.RomCenter.Credits
{
Author = "XXXXXX",
Version = "XXXXXX",
Email = "XXXXXX",
Homepage = "XXXXXX",
Url = "XXXXXX",
Date = "XXXXXX",
Comment = "XXXXXX",
};
var dat = new Models.RomCenter.Dat
{
Version = "XXXXXX",
Plugin = "XXXXXX",
Split = "XXXXXX",
Merge = "XXXXXX",
};
var emulator = new Models.RomCenter.Emulator
{
RefName = "XXXXXX",
Version = "XXXXXX",
};
var rom = new Models.RomCenter.Rom
{
ParentName = "XXXXXX",
ParentDescription = "XXXXXX",
GameName = "XXXXXX",
GameDescription = "XXXXXX",
RomName = "XXXXXX",
RomCRC = "XXXXXX",
RomSize = "XXXXXX",
RomOf = "XXXXXX",
MergeName = "XXXXXX",
};
var games = new Models.RomCenter.Games
{
Rom = [rom],
};
return new Models.RomCenter.MetadataFile
{
Credits = credits,
Dat = dat,
Emulator = emulator,
Games = games,
};
}
/// <summary>
/// Validate a Credits
/// </summary>
private static void Validate(Models.RomCenter.Credits? credits)
{
Assert.NotNull(credits);
Assert.Equal("XXXXXX", credits.Author);
Assert.Equal("XXXXXX", credits.Version);
Assert.Equal("XXXXXX", credits.Email);
Assert.Equal("XXXXXX", credits.Homepage);
Assert.Equal("XXXXXX", credits.Url);
Assert.Equal("XXXXXX", credits.Date);
Assert.Equal("XXXXXX", credits.Comment);
}
/// <summary>
/// Validate a Dat
/// </summary>
private static void Validate(Models.RomCenter.Dat? dat)
{
Assert.NotNull(dat);
Assert.Equal("XXXXXX", dat.Version);
Assert.Equal("XXXXXX", dat.Plugin);
Assert.Equal("no", dat.Split); // Converted due to filtering
Assert.Equal("no", dat.Merge); // Converted due to filtering
}
/// <summary>
/// Validate a Emulator
/// </summary>
private static void Validate(Models.RomCenter.Emulator? emulator)
{
Assert.NotNull(emulator);
Assert.Equal("XXXXXX", emulator.RefName);
Assert.Equal("XXXXXX", emulator.Version);
}
/// <summary>
/// Validate a Games
/// </summary>
private static void Validate(Models.RomCenter.Games? games)
{
Assert.NotNull(games);
Assert.NotNull(games.Rom);
var rom = Assert.Single(games.Rom);
Validate(rom);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.RomCenter.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.ParentName);
Assert.Null(rom.ParentDescription); // This is unmappable
Assert.Equal("XXXXXX", rom.GameName);
Assert.Equal("XXXXXX", rom.GameDescription);
Assert.Equal("XXXXXX", rom.RomName);
Assert.Equal("XXXXXX", rom.RomCRC);
Assert.Equal("XXXXXX", rom.RomSize);
Assert.Equal("XXXXXX", rom.RomOf);
Assert.Equal("XXXXXX", rom.MergeName);
}
}
}

View File

@@ -0,0 +1,182 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class SeparatedValueTests
{
[Fact]
public void RoundTripTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.SeparatedValue();
// Build the data
Models.SeparatedValue.MetadataFile mf = Build();
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(mf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.SeparatedValue.MetadataFile? newMf = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.Header);
Assert.NotNull(newMf.Row);
Assert.Equal(3, newMf.Row.Length);
ValidateDisk(newMf.Row[0]);
ValidateMedia(newMf.Row[1]);
ValidateRom(newMf.Row[2]);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.SeparatedValue.MetadataFile Build()
{
string[] header = ["header"];
var disk = new Models.SeparatedValue.Row
{
FileName = "XXXXXX",
InternalName = "XXXXXX",
Description = "XXXXXX",
GameName = "XXXXXX",
GameDescription = "XXXXXX",
Type = "disk",
DiskName = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Status = "XXXXXX",
};
var media = new Models.SeparatedValue.Row
{
FileName = "XXXXXX",
InternalName = "XXXXXX",
Description = "XXXXXX",
GameName = "XXXXXX",
GameDescription = "XXXXXX",
Type = "media",
DiskName = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
SHA256 = "XXXXXX",
SpamSum = "XXXXXX",
};
var rom = new Models.SeparatedValue.Row
{
FileName = "XXXXXX",
InternalName = "XXXXXX",
Description = "XXXXXX",
GameName = "XXXXXX",
GameDescription = "XXXXXX",
Type = "rom",
RomName = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
SHA256 = "XXXXXX",
SHA384 = "XXXXXX",
SHA512 = "XXXXXX",
SpamSum = "XXXXXX",
Status = "XXXXXX",
};
return new Models.SeparatedValue.MetadataFile
{
Header = header,
Row = [disk, media, rom],
};
}
/// <summary>
/// Validate a header
/// </summary>
private static void Validate(string[]? header)
{
Assert.NotNull(header);
string column = Assert.Single(header);
Assert.Equal("header", column);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateDisk(Models.SeparatedValue.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.FileName);
Assert.Equal("XXXXXX", row.InternalName);
Assert.Equal("XXXXXX", row.Description);
Assert.Equal("XXXXXX", row.GameName);
Assert.Equal("XXXXXX", row.GameDescription);
Assert.Equal("disk", row.Type);
Assert.Null(row.RomName);
Assert.Equal("XXXXXX", row.DiskName);
Assert.Null(row.Size);
Assert.Null(row.CRC);
Assert.Equal("XXXXXX", row.MD5);
Assert.Equal("XXXXXX", row.SHA1);
Assert.Null(row.SHA256);
Assert.Null(row.SHA384);
Assert.Null(row.SHA512);
Assert.Null(row.SpamSum);
Assert.Equal("XXXXXX", row.Status);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateMedia(Models.SeparatedValue.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.FileName);
Assert.Equal("XXXXXX", row.InternalName);
Assert.Equal("XXXXXX", row.Description);
Assert.Equal("XXXXXX", row.GameName);
Assert.Equal("XXXXXX", row.GameDescription);
Assert.Equal("media", row.Type);
Assert.Null(row.RomName);
Assert.Equal("XXXXXX", row.DiskName);
Assert.Null(row.Size);
Assert.Null(row.CRC);
Assert.Equal("XXXXXX", row.MD5);
Assert.Equal("XXXXXX", row.SHA1);
Assert.Equal("XXXXXX", row.SHA256);
Assert.Null(row.SHA384);
Assert.Null(row.SHA512);
Assert.Equal("XXXXXX", row.SpamSum);
Assert.Null(row.Status);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateRom(Models.SeparatedValue.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.FileName);
Assert.Equal("XXXXXX", row.InternalName);
Assert.Equal("XXXXXX", row.Description);
Assert.Equal("XXXXXX", row.GameName);
Assert.Equal("XXXXXX", row.GameDescription);
Assert.Equal("rom", row.Type);
Assert.Equal("XXXXXX", row.RomName);
Assert.Null(row.DiskName);
Assert.Equal("XXXXXX", row.Size);
Assert.Equal("XXXXXX", row.CRC);
Assert.Equal("XXXXXX", row.MD5);
Assert.Equal("XXXXXX", row.SHA1);
Assert.Equal("XXXXXX", row.SHA256);
Assert.Equal("XXXXXX", row.SHA384);
Assert.Equal("XXXXXX", row.SHA512);
Assert.Equal("XXXXXX", row.SpamSum);
Assert.Equal("XXXXXX", row.Status);
}
}
}

View File

@@ -0,0 +1,310 @@
using Xunit;
namespace SabreTools.Serialization.Test.CrossModel
{
public class SoftwareListTests
{
[Fact]
public void RoundTripTest()
{
// Get the cross-model serializer
var serializer = new Serialization.CrossModel.SoftwareList();
// Build the data
Models.SoftwareList.SoftwareList sl = Build();
// Serialize to generic model
Models.Metadata.MetadataFile? metadata = serializer.Serialize(sl);
Assert.NotNull(metadata);
// Serialize back to original model
Models.SoftwareList.SoftwareList? newSl = serializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newSl);
Assert.Equal("XXXXXX", newSl.Name);
Assert.Equal("XXXXXX", newSl.Description);
Assert.Equal("XXXXXX", newSl.Notes);
Assert.NotNull(newSl.Software);
var newSoftware = Assert.Single(newSl.Software);
Validate(newSoftware);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.SoftwareList.SoftwareList Build()
{
var info = new Models.SoftwareList.Info
{
Name = "XXXXXX",
Value = "XXXXXX",
};
var sharedfeat = new Models.SoftwareList.SharedFeat
{
Name = "XXXXXX",
Value = "XXXXXX",
};
var feature = new Models.SoftwareList.Feature
{
Name = "XXXXXX",
Value = "XXXXXX",
};
var rom = new Models.SoftwareList.Rom
{
Name = "XXXXXX",
Size = "XXXXXX",
Length = "XXXXXX",
CRC = "XXXXXX",
SHA1 = "XXXXXX",
Offset = "XXXXXX",
Value = "XXXXXX",
Status = "XXXXXX",
LoadFlag = "XXXXXX",
};
var dataarea = new Models.SoftwareList.DataArea
{
Name = "XXXXXX",
Size = "XXXXXX",
Width = "XXXXXX",
Endianness = "XXXXXX",
Rom = [rom],
};
var disk = new Models.SoftwareList.Disk
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Status = "XXXXXX",
Writeable = "XXXXXX",
};
var diskarea = new Models.SoftwareList.DiskArea
{
Name = "XXXXXX",
Disk = [disk],
};
var dipvalue = new Models.SoftwareList.DipValue
{
Name = "XXXXXX",
Value = "XXXXXX",
Default = "XXXXXX",
};
var dipswitch = new Models.SoftwareList.DipSwitch
{
Name = "XXXXXX",
Tag = "XXXXXX",
Mask = "XXXXXX",
DipValue = [dipvalue],
};
var part = new Models.SoftwareList.Part
{
Name = "XXXXXX",
Interface = "XXXXXX",
Feature = [feature],
DataArea = [dataarea],
DiskArea = [diskarea],
DipSwitch = [dipswitch],
};
var software = new Models.SoftwareList.Software
{
Name = "XXXXXX",
CloneOf = "XXXXXX",
Supported = "XXXXXX",
Description = "XXXXXX",
Year = "XXXXXX",
Publisher = "XXXXXX",
Notes = "XXXXXX",
Info = [info],
SharedFeat = [sharedfeat],
Part = [part],
};
return new Models.SoftwareList.SoftwareList
{
Name = "XXXXXX",
Description = "XXXXXX",
Notes = "XXXXXX",
Software = [software],
};
}
/// <summary>
/// Validate a Software
/// </summary>
private static void Validate(Models.SoftwareList.Software? software)
{
Assert.NotNull(software);
Assert.Equal("XXXXXX", software.Name);
Assert.Equal("XXXXXX", software.CloneOf);
Assert.Equal("XXXXXX", software.Supported);
Assert.Equal("XXXXXX", software.Description);
Assert.Equal("XXXXXX", software.Year);
Assert.Equal("XXXXXX", software.Publisher);
Assert.Equal("XXXXXX", software.Notes);
Assert.NotNull(software.Info);
var info = Assert.Single(software.Info);
Validate(info);
Assert.NotNull(software.SharedFeat);
var sharedfeat = Assert.Single(software.SharedFeat);
Validate(sharedfeat);
Assert.NotNull(software.Part);
var part = Assert.Single(software.Part);
Validate(part);
}
/// <summary>
/// Validate a Info
/// </summary>
private static void Validate(Models.SoftwareList.Info? info)
{
Assert.NotNull(info);
Assert.Equal("XXXXXX", info.Name);
Assert.Equal("XXXXXX", info.Value);
}
/// <summary>
/// Validate a SharedFeat
/// </summary>
private static void Validate(Models.SoftwareList.SharedFeat? sharedfeat)
{
Assert.NotNull(sharedfeat);
Assert.Equal("XXXXXX", sharedfeat.Name);
Assert.Equal("XXXXXX", sharedfeat.Value);
}
/// <summary>
/// Validate a Part
/// </summary>
private static void Validate(Models.SoftwareList.Part? part)
{
Assert.NotNull(part);
Assert.Equal("XXXXXX", part.Name);
Assert.Equal("XXXXXX", part.Interface);
Assert.NotNull(part.Feature);
var feature = Assert.Single(part.Feature);
Validate(feature);
Assert.NotNull(part.DataArea);
var dataarea = Assert.Single(part.DataArea);
Validate(dataarea);
Assert.NotNull(part.DiskArea);
var diskarea = Assert.Single(part.DiskArea);
Validate(diskarea);
Assert.NotNull(part.DipSwitch);
var dipswitch = Assert.Single(part.DipSwitch);
Validate(dipswitch);
}
/// <summary>
/// Validate a Feature
/// </summary>
private static void Validate(Models.SoftwareList.Feature? feature)
{
Assert.NotNull(feature);
Assert.Equal("XXXXXX", feature.Name);
Assert.Equal("XXXXXX", feature.Value);
}
/// <summary>
/// Validate a DataArea
/// </summary>
private static void Validate(Models.SoftwareList.DataArea? dataarea)
{
Assert.NotNull(dataarea);
Assert.Equal("XXXXXX", dataarea.Name);
Assert.Equal("XXXXXX", dataarea.Size);
Assert.Equal("XXXXXX", dataarea.Width);
Assert.Equal("XXXXXX", dataarea.Endianness);
Assert.NotNull(dataarea.Rom);
var rom = Assert.Single(dataarea.Rom);
Validate(rom);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.SoftwareList.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.Length);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX", rom.SHA1);
Assert.Equal("XXXXXX", rom.Offset);
Assert.Equal("XXXXXX", rom.Value);
Assert.Equal("XXXXXX", rom.Status);
Assert.Equal("XXXXXX", rom.LoadFlag);
}
/// <summary>
/// Validate a DiskArea
/// </summary>
private static void Validate(Models.SoftwareList.DiskArea? diskarea)
{
Assert.NotNull(diskarea);
Assert.Equal("XXXXXX", diskarea.Name);
Assert.NotNull(diskarea.Disk);
var disk = Assert.Single(diskarea.Disk);
Validate(disk);
}
/// <summary>
/// Validate a Disk
/// </summary>
private static void Validate(Models.SoftwareList.Disk? disk)
{
Assert.NotNull(disk);
Assert.Equal("XXXXXX", disk.Name);
Assert.Equal("XXXXXX", disk.MD5);
Assert.Equal("XXXXXX", disk.SHA1);
Assert.Equal("XXXXXX", disk.Status);
Assert.Equal("XXXXXX", disk.Writeable);
}
/// <summary>
/// Validate a DipSwitch
/// </summary>
private static void Validate(Models.SoftwareList.DipSwitch? dipswitch)
{
Assert.NotNull(dipswitch);
Assert.Equal("XXXXXX", dipswitch.Name);
Assert.Equal("XXXXXX", dipswitch.Tag);
Assert.Equal("XXXXXX", dipswitch.Mask);
Assert.NotNull(dipswitch.DipValue);
var dipvalue = Assert.Single(dipswitch.DipValue);
Validate(dipvalue);
}
/// <summary>
/// Validate a DipValue
/// </summary>
private static void Validate(Models.SoftwareList.DipValue? dipvalue)
{
Assert.NotNull(dipvalue);
Assert.Equal("XXXXXX", dipvalue.Name);
Assert.Equal("XXXXXX", dipvalue.Value);
Assert.Equal("XXXXXX", dipvalue.Default);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class AACSTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new AACS();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new AACS();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new AACS();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new AACS();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new AACS();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new AACS();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,241 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class ArchiveDotOrgTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new ArchiveDotOrg();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new ArchiveDotOrg();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new ArchiveDotOrg();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new ArchiveDotOrg();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new ArchiveDotOrg();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new ArchiveDotOrg();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.ArchiveDotOrg();
var serializer = new Serialization.Serializers.ArchiveDotOrg();
// Build the data
Models.ArchiveDotOrg.Files files = Build();
// Serialize to stream
Stream? actual = serializer.Serialize(files);
Assert.NotNull(actual);
// Serialize back to original model
Models.ArchiveDotOrg.Files? newFiles = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newFiles);
Assert.NotNull(newFiles.File);
var newFile = Assert.Single(newFiles.File);
Validate(newFile);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.ArchiveDotOrg.Files Build()
{
var file = new Models.ArchiveDotOrg.File
{
Name = "XXXXXX",
Source = "XXXXXX",
BitTorrentMagnetHash = "XXXXXX",
LastModifiedTime = "XXXXXX",
Size = "XXXXXX",
MD5 = "XXXXXX",
CRC32 = "XXXXXX",
SHA1 = "XXXXXX",
FileCount = "XXXXXX",
Format = "XXXXXX",
Original = "XXXXXX",
Summation = "XXXXXX",
MatrixNumber = "XXXXXX",
CollectionCatalogNumber = "XXXXXX",
Publisher = "XXXXXX",
Comment = "XXXXXX",
ASRDetectedLang = "XXXXXX",
ASRDetectedLangConf = "XXXXXX",
ASRTranscribedLang = "XXXXXX",
WhisperASRModuleVersion = "XXXXXX",
WhisperModelHash = "XXXXXX",
WhisperModelName = "XXXXXX",
WhisperVersion = "XXXXXX",
ClothCoverDetectionModuleVersion = "XXXXXX",
hOCRCharToWordhOCRVersion = "XXXXXX",
hOCRCharToWordModuleVersion = "XXXXXX",
hOCRFtsTexthOCRVersion = "XXXXXX",
hOCRFtsTextModuleVersion = "XXXXXX",
hOCRPageIndexhOCRVersion = "XXXXXX",
hOCRPageIndexModuleVersion = "XXXXXX",
TesseractOCR = "XXXXXX",
TesseractOCRConverted = "XXXXXX",
TesseractOCRDetectedLang = "XXXXXX",
TesseractOCRDetectedLangConf = "XXXXXX",
TesseractOCRDetectedScript = "XXXXXX",
TesseractOCRDetectedScriptConf = "XXXXXX",
TesseractOCRModuleVersion = "XXXXXX",
TesseractOCRParameters = "XXXXXX",
PDFModuleVersion = "XXXXXX",
WordConfidenceInterval0To10 = "XXXXXX",
WordConfidenceInterval11To20 = "XXXXXX",
WordConfidenceInterval21To30 = "XXXXXX",
WordConfidenceInterval31To40 = "XXXXXX",
WordConfidenceInterval41To50 = "XXXXXX",
WordConfidenceInterval51To60 = "XXXXXX",
WordConfidenceInterval61To70 = "XXXXXX",
WordConfidenceInterval71To80 = "XXXXXX",
WordConfidenceInterval81To90 = "XXXXXX",
WordConfidenceInterval91To100 = "XXXXXX",
Album = "XXXXXX",
Artist = "XXXXXX",
Bitrate = "XXXXXX",
Creator = "XXXXXX",
Height = "XXXXXX",
Length = "XXXXXX",
PreviewImage = "XXXXXX",
Rotation = "XXXXXX",
Title = "XXXXXX",
Track = "XXXXXX",
Width = "XXXXXX",
};
return new Models.ArchiveDotOrg.Files
{
File = [file]
};
}
/// <summary>
/// Validate a File
/// </summary>
private static void Validate(Models.ArchiveDotOrg.File? file)
{
Assert.NotNull(file);
Assert.Equal("XXXXXX", file.Name);
Assert.Equal("XXXXXX", file.Source);
Assert.Equal("XXXXXX", file.BitTorrentMagnetHash);
Assert.Equal("XXXXXX", file.LastModifiedTime);
Assert.Equal("XXXXXX", file.Size);
Assert.Equal("XXXXXX", file.MD5);
Assert.Equal("XXXXXX", file.CRC32);
Assert.Equal("XXXXXX", file.SHA1);
Assert.Equal("XXXXXX", file.FileCount);
Assert.Equal("XXXXXX", file.Format);
Assert.Equal("XXXXXX", file.Original);
Assert.Equal("XXXXXX", file.Summation);
Assert.Equal("XXXXXX", file.MatrixNumber);
Assert.Equal("XXXXXX", file.CollectionCatalogNumber);
Assert.Equal("XXXXXX", file.Publisher);
Assert.Equal("XXXXXX", file.Comment);
Assert.Equal("XXXXXX", file.ASRDetectedLang);
Assert.Equal("XXXXXX", file.ASRDetectedLangConf);
Assert.Equal("XXXXXX", file.ASRTranscribedLang);
Assert.Equal("XXXXXX", file.WhisperASRModuleVersion);
Assert.Equal("XXXXXX", file.WhisperModelHash);
Assert.Equal("XXXXXX", file.WhisperModelName);
Assert.Equal("XXXXXX", file.WhisperVersion);
Assert.Equal("XXXXXX", file.ClothCoverDetectionModuleVersion);
Assert.Equal("XXXXXX", file.hOCRCharToWordhOCRVersion);
Assert.Equal("XXXXXX", file.hOCRCharToWordModuleVersion);
Assert.Equal("XXXXXX", file.hOCRFtsTexthOCRVersion);
Assert.Equal("XXXXXX", file.hOCRFtsTextModuleVersion);
Assert.Equal("XXXXXX", file.hOCRPageIndexhOCRVersion);
Assert.Equal("XXXXXX", file.hOCRPageIndexModuleVersion);
Assert.Equal("XXXXXX", file.TesseractOCR);
Assert.Equal("XXXXXX", file.TesseractOCRConverted);
Assert.Equal("XXXXXX", file.TesseractOCRDetectedLang);
Assert.Equal("XXXXXX", file.TesseractOCRDetectedLangConf);
Assert.Equal("XXXXXX", file.TesseractOCRDetectedScript);
Assert.Equal("XXXXXX", file.TesseractOCRDetectedScriptConf);
Assert.Equal("XXXXXX", file.TesseractOCRModuleVersion);
Assert.Equal("XXXXXX", file.TesseractOCRParameters);
Assert.Equal("XXXXXX", file.PDFModuleVersion);
Assert.Equal("XXXXXX", file.WordConfidenceInterval0To10);
Assert.Equal("XXXXXX", file.WordConfidenceInterval11To20);
Assert.Equal("XXXXXX", file.WordConfidenceInterval21To30);
Assert.Equal("XXXXXX", file.WordConfidenceInterval31To40);
Assert.Equal("XXXXXX", file.WordConfidenceInterval41To50);
Assert.Equal("XXXXXX", file.WordConfidenceInterval51To60);
Assert.Equal("XXXXXX", file.WordConfidenceInterval61To70);
Assert.Equal("XXXXXX", file.WordConfidenceInterval71To80);
Assert.Equal("XXXXXX", file.WordConfidenceInterval81To90);
Assert.Equal("XXXXXX", file.WordConfidenceInterval91To100);
Assert.Equal("XXXXXX", file.Album);
Assert.Equal("XXXXXX", file.Artist);
Assert.Equal("XXXXXX", file.Bitrate);
Assert.Equal("XXXXXX", file.Creator);
Assert.Equal("XXXXXX", file.Height);
Assert.Equal("XXXXXX", file.Length);
Assert.Equal("XXXXXX", file.PreviewImage);
Assert.Equal("XXXXXX", file.Rotation);
Assert.Equal("XXXXXX", file.Title);
Assert.Equal("XXXXXX", file.Track);
Assert.Equal("XXXXXX", file.Width);
}
}
}

View File

@@ -0,0 +1,217 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class AttractModeTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new AttractMode();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new AttractMode();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new AttractMode();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new AttractMode();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new AttractMode();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
var data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new AttractMode();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripShortTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.AttractMode();
var serializer = new Serialization.Serializers.AttractMode();
// Build the data
Models.AttractMode.MetadataFile mf = Build();
// Serialize to stream
Stream? actual = serializer.Serialize(mf, longHeader: false);
Assert.NotNull(actual);
// Serialize back to original model
Models.AttractMode.MetadataFile? newMf = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.Header, longHeader: false);
Assert.NotNull(newMf.Row);
var newRow = Assert.Single(newMf.Row);
Validate(newRow, longHeader: false);
}
[Fact]
public void RoundTripLongTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.AttractMode();
var serializer = new Serialization.Serializers.AttractMode();
// Build the data
Models.AttractMode.MetadataFile mf = Build();
// Serialize to stream
Stream? actual = serializer.Serialize(mf, longHeader: true);
Assert.NotNull(actual);
// Serialize back to original model
Models.AttractMode.MetadataFile? newMf = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.Header, longHeader: true);
Assert.NotNull(newMf.Row);
var newRow = Assert.Single(newMf.Row);
Validate(newRow, longHeader: true);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.AttractMode.MetadataFile Build()
{
string[] header = ["header"];
var row = new Models.AttractMode.Row
{
Name = "XXXXXX",
Title = "XXXXXX",
Emulator = "XXXXXX",
CloneOf = "XXXXXX",
Year = "XXXXXX",
Manufacturer = "XXXXXX",
Category = "XXXXXX",
Players = "XXXXXX",
Rotation = "XXXXXX",
Control = "XXXXXX",
Status = "XXXXXX",
DisplayCount = "XXXXXX",
DisplayType = "XXXXXX",
AltRomname = "XXXXXX",
AltTitle = "XXXXXX",
Extra = "XXXXXX",
Buttons = "XXXXXX",
Favorite = "XXXXXX",
Tags = "XXXXXX",
PlayedCount = "XXXXXX",
PlayedTime = "XXXXXX",
FileIsAvailable = "XXXXXX",
};
return new Models.AttractMode.MetadataFile
{
Header = header,
Row = [row],
};
}
/// <summary>
/// Validate a header
/// </summary>
private static void Validate(string[]? header, bool longHeader)
{
Assert.NotNull(header);
if (longHeader)
Assert.True(Serialization.Serializers.AttractMode.HeaderArrayWithRomname.SequenceEqual(header));
else
Assert.True(Serialization.Serializers.AttractMode.HeaderArrayWithoutRomname.SequenceEqual(header));
}
/// <summary>
/// Validate a Row
/// </summary>
private static void Validate(Models.AttractMode.Row? row, bool longHeader)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.Name);
Assert.Equal("XXXXXX", row.Title);
Assert.Equal("XXXXXX", row.Emulator);
Assert.Equal("XXXXXX", row.CloneOf);
Assert.Equal("XXXXXX", row.Year);
Assert.Equal("XXXXXX", row.Manufacturer);
Assert.Equal("XXXXXX", row.Category);
Assert.Equal("XXXXXX", row.Players);
Assert.Equal("XXXXXX", row.Rotation);
Assert.Equal("XXXXXX", row.Control);
Assert.Equal("XXXXXX", row.Status);
Assert.Equal("XXXXXX", row.DisplayCount);
Assert.Equal("XXXXXX", row.DisplayType);
Assert.Equal("XXXXXX", row.AltRomname);
Assert.Equal("XXXXXX", row.AltTitle);
Assert.Equal("XXXXXX", row.Extra);
Assert.Equal("XXXXXX", row.Buttons);
if (longHeader)
{
Assert.Equal("XXXXXX", row.Favorite);
Assert.Equal("XXXXXX", row.Tags);
Assert.Equal("XXXXXX", row.PlayedCount);
Assert.Equal("XXXXXX", row.PlayedTime);
Assert.Equal("XXXXXX", row.FileIsAvailable);
}
else
{
Assert.Null(row.Favorite);
Assert.Null(row.Tags);
Assert.Null(row.PlayedCount);
Assert.Null(row.PlayedTime);
Assert.Null(row.FileIsAvailable);
}
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class BDPlusTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new BDPlus();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new BDPlus();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new BDPlus();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new BDPlus();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new BDPlus();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new BDPlus();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class BFPKTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new BFPK();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new BFPK();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new BFPK();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new BFPK();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new BFPK();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new BFPK();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class BSPTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new BSP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new BSP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new BSP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new BSP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new BSP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new BSP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class CFBTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new CFB();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new CFB();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new CFB();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new CFB();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new CFB();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new CFB();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class CHDTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new CHD();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new CHD();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new CHD();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new CHD();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new CHD();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new CHD();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class CIATests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new CIA();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new CIA();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new CIA();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new CIA();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new CIA();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new CIA();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class CatalogTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new Catalog();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new Catalog();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new Catalog();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new Catalog();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new Catalog();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new Catalog();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,561 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class ClrMameProTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new ClrMamePro();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new ClrMamePro();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new ClrMamePro();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new ClrMamePro();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new ClrMamePro();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new ClrMamePro();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripGameTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.ClrMamePro();
var serializer = new Serialization.Serializers.ClrMamePro();
// Build the data
Models.ClrMamePro.MetadataFile mf = Build(game: true);
// Serialize to stream
Stream? actual = serializer.Serialize(mf);
Assert.NotNull(actual);
// Serialize back to original model
Models.ClrMamePro.MetadataFile? newMf = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.ClrMamePro);
Assert.NotNull(newMf.Game);
var newGame = Assert.Single(newMf.Game);
Validate(newGame);
}
[Fact]
public void RoundTripMachineTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.ClrMamePro();
var serializer = new Serialization.Serializers.ClrMamePro();
// Build the data
Models.ClrMamePro.MetadataFile mf = Build(game: false);
// Serialize to stream
Stream? actual = serializer.Serialize(mf);
Assert.NotNull(actual);
// Serialize back to original model
Models.ClrMamePro.MetadataFile? newMf = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.ClrMamePro);
Assert.NotNull(newMf.Game);
var newGame = Assert.Single(newMf.Game);
Validate(newGame);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.ClrMamePro.MetadataFile Build(bool game)
{
var cmp = new Models.ClrMamePro.ClrMamePro
{
Name = "XXXXXX",
Description = "XXXXXX",
RootDir = "XXXXXX",
Category = "XXXXXX",
Version = "XXXXXX",
Date = "XXXXXX",
Author = "XXXXXX",
Homepage = "XXXXXX",
Url = "XXXXXX",
Comment = "XXXXXX",
Header = "XXXXXX",
Type = "XXXXXX",
ForceMerging = "XXXXXX",
ForceZipping = "XXXXXX",
ForcePacking = "XXXXXX",
};
var release = new Models.ClrMamePro.Release
{
Name = "XXXXXX",
Region = "XXXXXX",
Language = "XXXXXX",
Date = "XXXXXX",
Default = "XXXXXX",
};
var biosset = new Models.ClrMamePro.BiosSet
{
Name = "XXXXXX",
Description = "XXXXXX",
Default = "XXXXXX",
};
var rom = new Models.ClrMamePro.Rom
{
Name = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Status = "XXXXXX",
Flags = "XXXXXX",
Date = "XXXXXX",
SHA256 = "XXXXXX",
SHA384 = "XXXXXX",
SHA512 = "XXXXXX",
SpamSum = "XXXXXX",
xxHash364 = "XXXXXX",
xxHash3128 = "XXXXXX",
Region = "XXXXXX",
Offs = "XXXXXX",
Serial = "XXXXXX",
Header = "XXXXXX",
Inverted = "XXXXXX",
MIA = "XXXXXX",
};
var disk = new Models.ClrMamePro.Disk
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Status = "XXXXXX",
Flags = "XXXXXX",
};
var sample = new Models.ClrMamePro.Sample
{
Name = "XXXXXX",
};
var archive = new Models.ClrMamePro.Archive
{
Name = "XXXXXX",
};
var media = new Models.ClrMamePro.Media
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
SHA256 = "XXXXXX",
SpamSum = "XXXXXX",
};
var chip = new Models.ClrMamePro.Chip
{
Type = "XXXXXX",
Name = "XXXXXX",
Flags = "XXXXXX",
Clock = "XXXXXX",
};
var video = new Models.ClrMamePro.Video
{
Screen = "XXXXXX",
Orientation = "XXXXXX",
X = "XXXXXX",
Y = "XXXXXX",
AspectX = "XXXXXX",
AspectY = "XXXXXX",
Freq = "XXXXXX",
};
var sound = new Models.ClrMamePro.Sound
{
Channels = "XXXXXX",
};
var input = new Models.ClrMamePro.Input
{
Players = "XXXXXX",
Control = "XXXXXX",
Buttons = "XXXXXX",
Coins = "XXXXXX",
Tilt = "XXXXXX",
Service = "XXXXXX",
};
var dipswitch = new Models.ClrMamePro.DipSwitch
{
Name = "XXXXXX",
Entry = ["XXXXXX"],
Default = "XXXXXX",
};
var driver = new Models.ClrMamePro.Driver
{
Status = "XXXXXX",
Color = "XXXXXX",
Sound = "XXXXXX",
PaletteSize = "XXXXXX",
Blit = "XXXXXX",
};
// TODO: This omits Set, should that have a separate case?
Models.ClrMamePro.GameBase gameBase = game
? new Models.ClrMamePro.Game()
: new Models.ClrMamePro.Machine();
gameBase.Name = "XXXXXX";
gameBase.Description = "XXXXXX";
gameBase.Year = "XXXXXX";
gameBase.Manufacturer = "XXXXXX";
gameBase.Category = "XXXXXX";
gameBase.CloneOf = "XXXXXX";
gameBase.RomOf = "XXXXXX";
gameBase.SampleOf = "XXXXXX";
gameBase.Release = [release];
gameBase.BiosSet = [biosset];
gameBase.Rom = [rom];
gameBase.Disk = [disk];
gameBase.Sample = [sample];
gameBase.Archive = [archive];
gameBase.Media = [media];
gameBase.Chip = [chip];
gameBase.Video = [video];
gameBase.Sound = sound;
gameBase.Input = input;
gameBase.DipSwitch = [dipswitch];
gameBase.Driver = driver;
return new Models.ClrMamePro.MetadataFile
{
ClrMamePro = cmp,
Game = [gameBase],
};
}
/// <summary>
/// Validate a ClrMamePro
/// </summary>
private static void Validate(Models.ClrMamePro.ClrMamePro? cmp)
{
Assert.NotNull(cmp);
Assert.Equal("XXXXXX", cmp.Name);
Assert.Equal("XXXXXX", cmp.Description);
Assert.Equal("XXXXXX", cmp.RootDir);
Assert.Equal("XXXXXX", cmp.Category);
Assert.Equal("XXXXXX", cmp.Version);
Assert.Equal("XXXXXX", cmp.Date);
Assert.Equal("XXXXXX", cmp.Author);
Assert.Equal("XXXXXX", cmp.Homepage);
Assert.Equal("XXXXXX", cmp.Url);
Assert.Equal("XXXXXX", cmp.Comment);
Assert.Equal("XXXXXX", cmp.Header);
Assert.Equal("XXXXXX", cmp.Type);
Assert.Equal("XXXXXX", cmp.ForceMerging);
Assert.Equal("XXXXXX", cmp.ForceZipping);
Assert.Equal("XXXXXX", cmp.ForcePacking);
}
/// <summary>
/// Validate a GameBase
/// </summary>
private static void Validate(Models.ClrMamePro.GameBase? gb)
{
Assert.NotNull(gb);
Assert.Equal("XXXXXX", gb.Name);
Assert.Equal("XXXXXX", gb.Description);
Assert.Equal("XXXXXX", gb.Year);
Assert.Equal("XXXXXX", gb.Manufacturer);
Assert.Equal("XXXXXX", gb.Category);
Assert.Equal("XXXXXX", gb.CloneOf);
Assert.Equal("XXXXXX", gb.RomOf);
Assert.Equal("XXXXXX", gb.SampleOf);
Assert.NotNull(gb.Release);
var release = Assert.Single(gb.Release);
Validate(release);
Assert.NotNull(gb.BiosSet);
var biosset = Assert.Single(gb.BiosSet);
Validate(biosset);
Assert.NotNull(gb.Rom);
var rom = Assert.Single(gb.Rom);
Validate(rom);
Assert.NotNull(gb.Disk);
var disk = Assert.Single(gb.Disk);
Validate(disk);
Assert.NotNull(gb.Sample);
var sample = Assert.Single(gb.Sample);
Validate(sample);
Assert.NotNull(gb.Archive);
var archive = Assert.Single(gb.Archive);
Validate(archive);
Assert.NotNull(gb.Media);
var media = Assert.Single(gb.Media);
Validate(media);
Assert.NotNull(gb.Chip);
var chip = Assert.Single(gb.Chip);
Validate(chip);
Assert.NotNull(gb.Video);
var video = Assert.Single(gb.Video);
Validate(video);
Validate(gb.Sound);
Validate(gb.Input);
Assert.NotNull(gb.DipSwitch);
var dipswitch = Assert.Single(gb.DipSwitch);
Validate(dipswitch);
Validate(gb.Driver);
}
/// <summary>
/// Validate a Release
/// </summary>
private static void Validate(Models.ClrMamePro.Release? release)
{
Assert.NotNull(release);
Assert.Equal("XXXXXX", release.Name);
Assert.Equal("XXXXXX", release.Region);
Assert.Equal("XXXXXX", release.Language);
Assert.Equal("XXXXXX", release.Date);
Assert.Equal("XXXXXX", release.Default);
}
/// <summary>
/// Validate a BiosSet
/// </summary>
private static void Validate(Models.ClrMamePro.BiosSet? biosset)
{
Assert.NotNull(biosset);
Assert.Equal("XXXXXX", biosset.Name);
Assert.Equal("XXXXXX", biosset.Description);
Assert.Equal("XXXXXX", biosset.Default);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.ClrMamePro.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX", rom.MD5);
Assert.Equal("XXXXXX", rom.SHA1);
Assert.Equal("XXXXXX", rom.Merge);
Assert.Equal("XXXXXX", rom.Status);
Assert.Equal("XXXXXX", rom.Flags);
Assert.Equal("XXXXXX", rom.Date);
Assert.Equal("XXXXXX", rom.SHA256);
Assert.Equal("XXXXXX", rom.SHA384);
Assert.Equal("XXXXXX", rom.SHA512);
Assert.Equal("XXXXXX", rom.SpamSum);
Assert.Equal("XXXXXX", rom.xxHash364);
Assert.Equal("XXXXXX", rom.xxHash3128);
Assert.Equal("XXXXXX", rom.Region);
Assert.Equal("XXXXXX", rom.Offs);
Assert.Equal("XXXXXX", rom.Serial);
Assert.Equal("XXXXXX", rom.Header);
Assert.Equal("XXXXXX", rom.Inverted);
Assert.Equal("XXXXXX", rom.MIA);
}
/// <summary>
/// Validate a Disk
/// </summary>
private static void Validate(Models.ClrMamePro.Disk? disk)
{
Assert.NotNull(disk);
Assert.Equal("XXXXXX", disk.Name);
Assert.Equal("XXXXXX", disk.MD5);
Assert.Equal("XXXXXX", disk.SHA1);
Assert.Equal("XXXXXX", disk.Merge);
Assert.Equal("XXXXXX", disk.Status);
Assert.Equal("XXXXXX", disk.Flags);
}
/// <summary>
/// Validate a Sample
/// </summary>
private static void Validate(Models.ClrMamePro.Sample? sample)
{
Assert.NotNull(sample);
Assert.Equal("XXXXXX", sample.Name);
}
/// <summary>
/// Validate a Archive
/// </summary>
private static void Validate(Models.ClrMamePro.Archive? archive)
{
Assert.NotNull(archive);
Assert.Equal("XXXXXX", archive.Name);
}
/// <summary>
/// Validate a Media
/// </summary>
private static void Validate(Models.ClrMamePro.Media? media)
{
Assert.NotNull(media);
Assert.Equal("XXXXXX", media.Name);
Assert.Equal("XXXXXX", media.MD5);
Assert.Equal("XXXXXX", media.SHA1);
Assert.Equal("XXXXXX", media.SHA256);
Assert.Equal("XXXXXX", media.SpamSum);
}
/// <summary>
/// Validate a Chip
/// </summary>
private static void Validate(Models.ClrMamePro.Chip? chip)
{
Assert.NotNull(chip);
Assert.Equal("XXXXXX", chip.Type);
Assert.Equal("XXXXXX", chip.Name);
Assert.Equal("XXXXXX", chip.Flags);
Assert.Equal("XXXXXX", chip.Clock);
}
/// <summary>
/// Validate a Video
/// </summary>
private static void Validate(Models.ClrMamePro.Video? video)
{
Assert.NotNull(video);
Assert.Equal("XXXXXX", video.Screen);
Assert.Equal("XXXXXX", video.Orientation);
Assert.Equal("XXXXXX", video.X);
Assert.Equal("XXXXXX", video.Y);
Assert.Equal("XXXXXX", video.AspectX);
Assert.Equal("XXXXXX", video.AspectY);
Assert.Equal("XXXXXX", video.Freq);
}
/// <summary>
/// Validate a Sound
/// </summary>
private static void Validate(Models.ClrMamePro.Sound? sound)
{
Assert.NotNull(sound);
Assert.Equal("XXXXXX", sound.Channels);
}
/// <summary>
/// Validate a Input
/// </summary>
private static void Validate(Models.ClrMamePro.Input? input)
{
Assert.NotNull(input);
Assert.Equal("XXXXXX", input.Players);
Assert.Equal("XXXXXX", input.Control);
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.Equal("XXXXXX", input.Tilt);
Assert.Equal("XXXXXX", input.Service);
}
/// <summary>
/// Validate a DipSwitch
/// </summary>
private static void Validate(Models.ClrMamePro.DipSwitch? dipswitch)
{
Assert.NotNull(dipswitch);
Assert.Equal("XXXXXX", dipswitch.Name);
Assert.NotNull(dipswitch.Entry);
string entry = Assert.Single(dipswitch.Entry);
Assert.Equal("XXXXXX", entry);
Assert.Equal("XXXXXX", dipswitch.Default);
}
/// <summary>
/// Validate a Driver
/// </summary>
private static void Validate(Models.ClrMamePro.Driver? driver)
{
Assert.NotNull(driver);
Assert.Equal("XXXXXX", driver.Status);
Assert.Equal("XXXXXX", driver.Color);
Assert.Equal("XXXXXX", driver.Sound);
Assert.Equal("XXXXXX", driver.PaletteSize);
Assert.Equal("XXXXXX", driver.Blit);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class CueSheetTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new CueSheet();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new CueSheet();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new CueSheet();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new CueSheet();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new CueSheet();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new CueSheet();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,176 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class DosCenterTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new DosCenter();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new DosCenter();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new DosCenter();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new DosCenter();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new DosCenter();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new DosCenter();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.DosCenter();
var serializer = new Serialization.Serializers.DosCenter();
// Build the data
Models.DosCenter.MetadataFile mf = Build();
// Serialize to stream
Stream? actual = serializer.Serialize(mf);
Assert.NotNull(actual);
// Serialize back to original model
Models.DosCenter.MetadataFile? newMf = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.DosCenter);
Assert.NotNull(newMf.Game);
var newGame = Assert.Single(newMf.Game);
Validate(newGame);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.DosCenter.MetadataFile Build()
{
var dc = new Models.DosCenter.DosCenter
{
Name = "XXXXXX",
Description = "XXXXXX",
Version = "XXXXXX",
Date = "XXXXXX",
Author = "XXXXXX",
Homepage = "XXXXXX",
Comment = "XXXXXX",
};
var file = new Models.DosCenter.File
{
Name = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
Date = "XXXXXX XXXXXX",
};
var game = new Models.DosCenter.Game
{
Name = "XXXXXX",
File = [file],
};
return new Models.DosCenter.MetadataFile
{
DosCenter = dc,
Game = [game],
};
}
/// <summary>
/// Validate a DosCenter
/// </summary>
private static void Validate(Models.DosCenter.DosCenter? cmp)
{
Assert.NotNull(cmp);
Assert.Equal("XXXXXX", cmp.Name);
Assert.Equal("XXXXXX", cmp.Description);
Assert.Equal("XXXXXX", cmp.Version);
Assert.Equal("XXXXXX", cmp.Date);
Assert.Equal("XXXXXX", cmp.Author);
Assert.Equal("XXXXXX", cmp.Homepage);
Assert.Equal("XXXXXX", cmp.Comment);
}
/// <summary>
/// Validate a Game
/// </summary>
private static void Validate(Models.DosCenter.Game? game)
{
Assert.NotNull(game);
Assert.Equal("XXXXXX", game.Name);
Assert.NotNull(game.File);
var file = Assert.Single(game.File);
Validate(file);
}
/// <summary>
/// Validate a File
/// </summary>
private static void Validate(Models.DosCenter.File? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX XXXXXX", rom.Date);
}
}
}

View File

@@ -0,0 +1,133 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class EverdriveSMDBTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new EverdriveSMDB();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new EverdriveSMDB();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new EverdriveSMDB();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new EverdriveSMDB();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new EverdriveSMDB();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new EverdriveSMDB();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.EverdriveSMDB();
var serializer = new Serialization.Serializers.EverdriveSMDB();
// Build the data
Models.EverdriveSMDB.MetadataFile mf = Build();
// Serialize to stream
Stream? actual = serializer.Serialize(mf);
Assert.NotNull(actual);
// Serialize back to original model
Models.EverdriveSMDB.MetadataFile? newMf = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newMf);
Assert.NotNull(newMf.Row);
var newRow = Assert.Single(newMf.Row);
Validate(newRow);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.EverdriveSMDB.MetadataFile Build()
{
var row = new Models.EverdriveSMDB.Row
{
SHA256 = "XXXXXX",
Name = "XXXXXX",
SHA1 = "XXXXXX",
MD5 = "XXXXXX",
CRC32 = "XXXXXX",
Size = "XXXXXX",
};
return new Models.EverdriveSMDB.MetadataFile
{
Row = [row],
};
}
/// <summary>
/// Validate a Row
/// </summary>
private static void Validate(Models.EverdriveSMDB.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.SHA256);
Assert.Equal("XXXXXX", row.Name);
Assert.Equal("XXXXXX", row.SHA1);
Assert.Equal("XXXXXX", row.MD5);
Assert.Equal("XXXXXX", row.CRC32);
Assert.Equal("XXXXXX", row.Size);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class GCFTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new GCF();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new GCF();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new GCF();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new GCF();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new GCF();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new GCF();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,401 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Hashing;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class HashfileTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new Hashfile();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new Hashfile();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new Hashfile();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new Hashfile();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new Hashfile();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new Hashfile();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripSFVTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Hashfile();
var serializer = new Serialization.Serializers.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.CRC32);
// Serialize to stream
Stream? actual = serializer.Serialize(hf, HashType.CRC32);
Assert.NotNull(actual);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.CRC32);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SFV);
var newSfv = Assert.Single(newHf.SFV);
Validate(newSfv);
}
[Fact]
public void RoundTripMD2Test()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Hashfile();
var serializer = new Serialization.Serializers.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.MD2);
// Serialize to stream
Stream? actual = serializer.Serialize(hf, HashType.MD2);
Assert.NotNull(actual);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.MD2);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.MD2);
var newMd2 = Assert.Single(newHf.MD2);
Validate(newMd2);
}
[Fact]
public void RoundTripMD4Test()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Hashfile();
var serializer = new Serialization.Serializers.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.MD4);
// Serialize to stream
Stream? actual = serializer.Serialize(hf, HashType.MD4);
Assert.NotNull(actual);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.MD4);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.MD4);
var newMd4 = Assert.Single(newHf.MD4);
Validate(newMd4);
}
[Fact]
public void RoundTripMD5Test()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Hashfile();
var serializer = new Serialization.Serializers.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.MD5);
// Serialize to stream
Stream? actual = serializer.Serialize(hf, HashType.MD5);
Assert.NotNull(actual);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.MD5);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.MD5);
var newMd5 = Assert.Single(newHf.MD5);
Validate(newMd5);
}
[Fact]
public void RoundTripSHA1Test()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Hashfile();
var serializer = new Serialization.Serializers.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.SHA1);
// Serialize to stream
Stream? actual = serializer.Serialize(hf, HashType.SHA1);
Assert.NotNull(actual);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.SHA1);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SHA1);
var newSha1 = Assert.Single(newHf.SHA1);
Validate(newSha1);
}
[Fact]
public void RoundTripSHA256Test()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Hashfile();
var serializer = new Serialization.Serializers.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.SHA256);
// Serialize to stream
Stream? actual = serializer.Serialize(hf, HashType.SHA256);
Assert.NotNull(actual);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.SHA256);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SHA256);
var newSha256 = Assert.Single(newHf.SHA256);
Validate(newSha256);
}
[Fact]
public void RoundTripSHA384Test()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Hashfile();
var serializer = new Serialization.Serializers.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.SHA384);
// Serialize to stream
Stream? actual = serializer.Serialize(hf, HashType.SHA384);
Assert.NotNull(actual);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.SHA384);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SHA384);
var newSha384 = Assert.Single(newHf.SHA384);
Validate(newSha384);
}
[Fact]
public void RoundTripSHA512Test()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Hashfile();
var serializer = new Serialization.Serializers.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.SHA512);
// Serialize to stream
Stream? actual = serializer.Serialize(hf, HashType.SHA512);
Assert.NotNull(actual);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.SHA512);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SHA512);
var newSha512 = Assert.Single(newHf.SHA512);
Validate(newSha512);
}
[Fact]
public void RoundTripSpamSumTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Hashfile();
var serializer = new Serialization.Serializers.Hashfile();
// Build the data
Models.Hashfile.Hashfile hf = Build(HashType.SpamSum);
// Serialize to stream
Stream? actual = serializer.Serialize(hf, HashType.SpamSum);
Assert.NotNull(actual);
// Serialize back to original model
Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.SpamSum);
// Validate the data
Assert.NotNull(newHf);
Assert.NotNull(newHf.SpamSum);
var newSpamsum = Assert.Single(newHf.SpamSum);
Validate(newSpamsum);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.Hashfile.Hashfile Build(HashType hashType)
{
return hashType switch
{
HashType.CRC32 => new Models.Hashfile.Hashfile { SFV = [new Models.Hashfile.SFV { File = "XXXXXX", Hash = "XXXXXX" }] },
HashType.MD2 => new Models.Hashfile.Hashfile { MD2 = [new Models.Hashfile.MD2 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.MD4 => new Models.Hashfile.Hashfile { MD4 = [new Models.Hashfile.MD4 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.MD5 => new Models.Hashfile.Hashfile { MD5 = [new Models.Hashfile.MD5 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA1 => new Models.Hashfile.Hashfile { SHA1 = [new Models.Hashfile.SHA1 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA256 => new Models.Hashfile.Hashfile { SHA256 = [new Models.Hashfile.SHA256 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA384 => new Models.Hashfile.Hashfile { SHA384 = [new Models.Hashfile.SHA384 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SHA512 => new Models.Hashfile.Hashfile { SHA512 = [new Models.Hashfile.SHA512 { Hash = "XXXXXX", File = "XXXXXX" }] },
HashType.SpamSum => new Models.Hashfile.Hashfile { SpamSum = [new Models.Hashfile.SpamSum { Hash = "XXXXXX", File = "XXXXXX" }] },
_ => throw new ArgumentOutOfRangeException(),
};
}
/// <summary>
/// Validate a SFV
/// </summary>
private static void Validate(Models.Hashfile.SFV? sfv)
{
Assert.NotNull(sfv);
Assert.Equal("XXXXXX", sfv.File);
Assert.Equal("XXXXXX", sfv.Hash);
}
/// <summary>
/// Validate a MD2
/// </summary>
private static void Validate(Models.Hashfile.MD2? md2)
{
Assert.NotNull(md2);
Assert.Equal("XXXXXX", md2.Hash);
Assert.Equal("XXXXXX", md2.File);
}
/// <summary>
/// Validate a MD4
/// </summary>
private static void Validate(Models.Hashfile.MD4? md4)
{
Assert.NotNull(md4);
Assert.Equal("XXXXXX", md4.Hash);
Assert.Equal("XXXXXX", md4.File);
}
/// <summary>
/// Validate a MD5
/// </summary>
private static void Validate(Models.Hashfile.MD5? md5)
{
Assert.NotNull(md5);
Assert.Equal("XXXXXX", md5.Hash);
Assert.Equal("XXXXXX", md5.File);
}
/// <summary>
/// Validate a SHA1
/// </summary>
private static void Validate(Models.Hashfile.SHA1? sha1)
{
Assert.NotNull(sha1);
Assert.Equal("XXXXXX", sha1.Hash);
Assert.Equal("XXXXXX", sha1.File);
}
/// <summary>
/// Validate a SHA256
/// </summary>
private static void Validate(Models.Hashfile.SHA256? sha256)
{
Assert.NotNull(sha256);
Assert.Equal("XXXXXX", sha256.Hash);
Assert.Equal("XXXXXX", sha256.File);
}
/// <summary>
/// Validate a SHA384
/// </summary>
private static void Validate(Models.Hashfile.SHA384? sha384)
{
Assert.NotNull(sha384);
Assert.Equal("XXXXXX", sha384.Hash);
Assert.Equal("XXXXXX", sha384.File);
}
/// <summary>
/// Validate a SHA512
/// </summary>
private static void Validate(Models.Hashfile.SHA512? sha512)
{
Assert.NotNull(sha512);
Assert.Equal("XXXXXX", sha512.Hash);
Assert.Equal("XXXXXX", sha512.File);
}
/// <summary>
/// Validate a SpamSum
/// </summary>
private static void Validate(Models.Hashfile.SpamSum? spamsum)
{
Assert.NotNull(spamsum);
Assert.Equal("XXXXXX", spamsum.Hash);
Assert.Equal("XXXXXX", spamsum.File);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class IRDTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new IRD();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new IRD();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new IRD();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new IRD();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new IRD();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new IRD();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class InstallShieldArchiveV3Tests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new InstallShieldArchiveV3();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new InstallShieldArchiveV3();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new InstallShieldArchiveV3();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new InstallShieldArchiveV3();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new InstallShieldArchiveV3();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new InstallShieldArchiveV3();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class InstallShieldCabinetTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new InstallShieldCabinet();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new InstallShieldCabinet();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new InstallShieldCabinet();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new InstallShieldCabinet();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new InstallShieldCabinet();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new InstallShieldCabinet();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class LinearExecutableTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new LinearExecutable();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new LinearExecutable();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new LinearExecutable();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new LinearExecutable();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new LinearExecutable();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new LinearExecutable();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,268 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class ListromTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new Listrom();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new Listrom();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new Listrom();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new Listrom();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new Listrom();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new Listrom();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Listrom();
var serializer = new Serialization.Serializers.Listrom();
// Build the data
Models.Listrom.MetadataFile mf = Build();
// Serialize to stream
Stream? actual = serializer.Serialize(mf);
Assert.NotNull(actual);
// Serialize back to original model
Models.Listrom.MetadataFile? newMf = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newMf);
Assert.NotNull(newMf.Set);
Assert.Equal(2, newMf.Set.Length);
ValidateDevice(newMf.Set[0]);
ValidateDriver(newMf.Set[1]);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.Listrom.MetadataFile Build()
{
var romGood = new Models.Listrom.Row
{
Name = "XXXXXX",
Size = "12345",
Bad = false,
CRC = Hashing.ZeroHash.CRC32Str,
SHA1 = Hashing.ZeroHash.SHA1Str,
NoGoodDumpKnown = false,
};
var romBad = new Models.Listrom.Row
{
Name = "XXXXXX",
Size = "12345",
Bad = true,
CRC = Hashing.ZeroHash.CRC32Str,
SHA1 = Hashing.ZeroHash.SHA1Str,
NoGoodDumpKnown = false,
};
var diskGoodMd5 = new Models.Listrom.Row
{
Name = "XXXXXX",
Bad = false,
MD5 = Hashing.ZeroHash.MD5Str,
SHA1 = null,
NoGoodDumpKnown = false,
};
var diskGoodSha1 = new Models.Listrom.Row
{
Name = "XXXXXX",
Bad = false,
MD5 = null,
SHA1 = Hashing.ZeroHash.SHA1Str,
NoGoodDumpKnown = false,
};
var diskBad = new Models.Listrom.Row
{
Name = "XXXXXX",
Bad = false,
MD5 = Hashing.ZeroHash.MD5Str,
SHA1 = Hashing.ZeroHash.SHA1Str,
NoGoodDumpKnown = true,
};
var device = new Models.Listrom.Set()
{
Device = "XXXXXX",
Row = [romGood, romBad],
};
var driver = new Models.Listrom.Set()
{
Driver = "XXXXXX",
Row = [diskGoodMd5, diskGoodSha1, diskBad],
};
return new Models.Listrom.MetadataFile
{
Set = [device, driver],
};
}
/// <summary>
/// Validate a Set
/// </summary>
private static void ValidateDevice(Models.Listrom.Set? set)
{
Assert.NotNull(set);
Assert.Equal("XXXXXX", set.Device);
Assert.NotNull(set.Row);
Assert.Equal(2, set.Row.Length);
ValidateGoodRom(set.Row[0]);
ValidateBadRom(set.Row[1]);
}
/// <summary>
/// Validate a Set
/// </summary>
private static void ValidateDriver(Models.Listrom.Set? set)
{
Assert.NotNull(set);
Assert.Equal("XXXXXX", set.Driver);
Assert.NotNull(set.Row);
Assert.Equal(3, set.Row.Length);
ValidateGoodMd5Disk(set.Row[0]);
ValidateGoodSha1Disk(set.Row[1]);
ValidateBadDisk(set.Row[2]);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateGoodRom(Models.Listrom.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.Name);
Assert.Equal("12345", row.Size);
Assert.False(row.Bad);
Assert.Equal(Hashing.ZeroHash.CRC32Str, row.CRC);
Assert.Equal(Hashing.ZeroHash.SHA1Str, row.SHA1);
Assert.False(row.NoGoodDumpKnown);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateBadRom(Models.Listrom.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.Name);
Assert.Equal("12345", row.Size);
Assert.True(row.Bad);
Assert.Equal(Hashing.ZeroHash.CRC32Str, row.CRC);
Assert.Equal(Hashing.ZeroHash.SHA1Str, row.SHA1);
Assert.False(row.NoGoodDumpKnown);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateGoodMd5Disk(Models.Listrom.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.Name);
Assert.False(row.Bad);
Assert.Equal(Hashing.ZeroHash.MD5Str, row.MD5);
Assert.Null(row.SHA1);
Assert.False(row.NoGoodDumpKnown);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateGoodSha1Disk(Models.Listrom.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.Name);
Assert.False(row.Bad);
Assert.Null(row.MD5);
Assert.Equal(Hashing.ZeroHash.SHA1Str, row.SHA1);
Assert.False(row.NoGoodDumpKnown);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateBadDisk(Models.Listrom.Row? row)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.Name);
Assert.False(row.Bad);
Assert.Null(row.MD5);
Assert.Null(row.SHA1);
Assert.True(row.NoGoodDumpKnown);
}
}
}

View File

@@ -0,0 +1,947 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class ListxmlTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new Listxml();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new Listxml();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new Listxml();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new Listxml();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new Listxml();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new Listxml();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripGameTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Listxml();
var serializer = new Serialization.Serializers.Listxml();
// Build the data
Models.Listxml.Mame mame = Build(game: true);
// Serialize to stream
Stream? actual = serializer.Serialize(mame);
Assert.NotNull(actual);
// Serialize back to original model
Models.Listxml.Mame? newMame = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newMame);
Assert.Equal("XXXXXX", newMame.Build);
Assert.Equal("XXXXXX", newMame.Debug);
Assert.Equal("XXXXXX", newMame.MameConfig);
Assert.NotNull(newMame.Game);
var newGame = Assert.Single(newMame.Game);
Validate(newGame);
}
[Fact]
public void RoundTripMachineTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Listxml();
var serializer = new Serialization.Serializers.Listxml();
// Build the data
Models.Listxml.Mame mame = Build(game: false);
// Serialize to stream
Stream? actual = serializer.Serialize(mame);
Assert.NotNull(actual);
// Serialize back to original model
Models.Listxml.Mame? newMame = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newMame);
Assert.Equal("XXXXXX", newMame.Build);
Assert.Equal("XXXXXX", newMame.Debug);
Assert.Equal("XXXXXX", newMame.MameConfig);
Assert.NotNull(newMame.Game);
var newGame = Assert.Single(newMame.Game);
Validate(newGame);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.Listxml.Mame Build(bool game)
{
var biosset = new Models.Listxml.BiosSet
{
Name = "XXXXXX",
Description = "XXXXXX",
Default = "XXXXXX",
};
var rom = new Models.Listxml.Rom
{
Name = "XXXXXX",
Bios = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Region = "XXXXXX",
Offset = "XXXXXX",
Status = "XXXXXX",
Optional = "XXXXXX",
Dispose = "XXXXXX",
SoundOnly = "XXXXXX",
};
var disk = new Models.Listxml.Disk
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Region = "XXXXXX",
Index = "XXXXXX",
Writable = "XXXXXX",
Status = "XXXXXX",
Optional = "XXXXXX",
};
var deviceref = new Models.Listxml.DeviceRef
{
Name = "XXXXXX",
};
var sample = new Models.Listxml.Sample
{
Name = "XXXXXX",
};
var chip = new Models.Listxml.Chip
{
Name = "XXXXXX",
Tag = "XXXXXX",
Type = "XXXXXX",
SoundOnly = "XXXXXX",
Clock = "XXXXXX",
};
var display = new Models.Listxml.Display
{
Tag = "XXXXXX",
Type = "XXXXXX",
Rotate = "XXXXXX",
FlipX = "XXXXXX",
Width = "XXXXXX",
Height = "XXXXXX",
Refresh = "XXXXXX",
PixClock = "XXXXXX",
HTotal = "XXXXXX",
HBEnd = "XXXXXX",
HBStart = "XXXXXX",
VTotal = "XXXXXX",
VBEnd = "XXXXXX",
VBStart = "XXXXXX",
};
var video = new Models.Listxml.Video
{
Screen = "XXXXXX",
Orientation = "XXXXXX",
Width = "XXXXXX",
Height = "XXXXXX",
AspectX = "XXXXXX",
AspectY = "XXXXXX",
Refresh = "XXXXXX",
};
var sound = new Models.Listxml.Sound
{
Channels = "XXXXXX",
};
var control = new Models.Listxml.Control
{
Type = "XXXXXX",
Player = "XXXXXX",
Buttons = "XXXXXX",
ReqButtons = "XXXXXX",
Minimum = "XXXXXX",
Maximum = "XXXXXX",
Sensitivity = "XXXXXX",
KeyDelta = "XXXXXX",
Reverse = "XXXXXX",
Ways = "XXXXXX",
Ways2 = "XXXXXX",
Ways3 = "XXXXXX",
};
var input = new Models.Listxml.Input
{
Service = "XXXXXX",
Tilt = "XXXXXX",
Players = "XXXXXX",
//ControlAttr = "XXXXXX", // Mututally exclusive with input.Control
Buttons = "XXXXXX",
Coins = "XXXXXX",
Control = [control],
};
var condition = new Models.Listxml.Condition
{
Tag = "XXXXXX",
Mask = "XXXXXX",
Relation = "XXXXXX",
Value = "XXXXXX",
};
var diplocation = new Models.Listxml.DipLocation
{
Name = "XXXXXX",
Number = "XXXXXX",
Inverted = "XXXXXX",
};
var dipvalue = new Models.Listxml.DipValue
{
Name = "XXXXXX",
Value = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var dipswitch = new Models.Listxml.DipSwitch
{
Name = "XXXXXX",
Tag = "XXXXXX",
Mask = "XXXXXX",
Condition = condition,
DipLocation = [diplocation],
DipValue = [dipvalue],
};
var conflocation = new Models.Listxml.ConfLocation
{
Name = "XXXXXX",
Number = "XXXXXX",
Inverted = "XXXXXX",
};
var confsetting = new Models.Listxml.ConfSetting
{
Name = "XXXXXX",
Value = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var configuration = new Models.Listxml.Configuration
{
Name = "XXXXXX",
Tag = "XXXXXX",
Mask = "XXXXXX",
Condition = condition,
ConfLocation = [conflocation],
ConfSetting = [confsetting],
};
var analog = new Models.Listxml.Analog
{
Mask = "XXXXXX",
};
var port = new Models.Listxml.Port
{
Tag = "XXXXXX",
Analog = [analog],
};
var adjuster = new Models.Listxml.Adjuster
{
Name = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var driver = new Models.Listxml.Driver
{
Status = "XXXXXX",
Color = "XXXXXX",
Sound = "XXXXXX",
PaletteSize = "XXXXXX",
Emulation = "XXXXXX",
Cocktail = "XXXXXX",
SaveState = "XXXXXX",
RequiresArtwork = "XXXXXX",
Unofficial = "XXXXXX",
NoSoundHardware = "XXXXXX",
Incomplete = "XXXXXX",
};
var feature = new Models.Listxml.Feature
{
Type = "XXXXXX",
Status = "XXXXXX",
Overall = "XXXXXX",
};
var instance = new Models.Listxml.Instance
{
Name = "XXXXXX",
BriefName = "XXXXXX",
};
var extension = new Models.Listxml.Extension
{
Name = "XXXXXX",
};
var device = new Models.Listxml.Device
{
Type = "XXXXXX",
Tag = "XXXXXX",
FixedImage = "XXXXXX",
Mandatory = "XXXXXX",
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
};
var slotOption = new Models.Listxml.SlotOption
{
Name = "XXXXXX",
DevName = "XXXXXX",
Default = "XXXXXX",
};
var slot = new Models.Listxml.Slot
{
Name = "XXXXXX",
SlotOption = [slotOption],
};
var softwarelist = new Models.Listxml.SoftwareList
{
Tag = "XXXXXX",
Name = "XXXXXX",
Status = "XXXXXX",
Filter = "XXXXXX",
};
var ramoption = new Models.Listxml.RamOption
{
Name = "XXXXXX",
Default = "XXXXXX",
Content = "XXXXXX",
};
Models.Listxml.GameBase gameBase = game
? new Models.Listxml.Game()
: new Models.Listxml.Machine();
gameBase.Name = "XXXXXX";
gameBase.SourceFile = "XXXXXX";
gameBase.IsBios = "XXXXXX";
gameBase.IsDevice = "XXXXXX";
gameBase.IsMechanical = "XXXXXX";
gameBase.Runnable = "XXXXXX";
gameBase.CloneOf = "XXXXXX";
gameBase.RomOf = "XXXXXX";
gameBase.SampleOf = "XXXXXX";
gameBase.Description = "XXXXXX";
gameBase.Year = "XXXXXX";
gameBase.Manufacturer = "XXXXXX";
gameBase.History = "XXXXXX";
gameBase.BiosSet = [biosset];
gameBase.Rom = [rom];
gameBase.Disk = [disk];
gameBase.DeviceRef = [deviceref];
gameBase.Sample = [sample];
gameBase.Chip = [chip];
gameBase.Display = [display];
gameBase.Video = [video];
gameBase.Sound = sound;
gameBase.Input = input;
gameBase.DipSwitch = [dipswitch];
gameBase.Configuration = [configuration];
gameBase.Port = [port];
gameBase.Adjuster = [adjuster];
gameBase.Driver = driver;
gameBase.Feature = [feature];
gameBase.Device = [device];
gameBase.Slot = [slot];
gameBase.SoftwareList = [softwarelist];
gameBase.RamOption = [ramoption];
return new Models.Listxml.Mame
{
Build = "XXXXXX",
Debug = "XXXXXX",
MameConfig = "XXXXXX",
Game = [gameBase],
};
}
/// <summary>
/// Validate a GameBase
/// </summary>
private static void Validate(Models.Listxml.GameBase? gb)
{
Assert.NotNull(gb);
Assert.Equal("XXXXXX", gb.Name);
Assert.Equal("XXXXXX", gb.SourceFile);
Assert.Equal("XXXXXX", gb.IsBios);
Assert.Equal("XXXXXX", gb.IsDevice);
Assert.Equal("XXXXXX", gb.IsMechanical);
Assert.Equal("XXXXXX", gb.Runnable);
Assert.Equal("XXXXXX", gb.CloneOf);
Assert.Equal("XXXXXX", gb.RomOf);
Assert.Equal("XXXXXX", gb.SampleOf);
Assert.Equal("XXXXXX", gb.Description);
Assert.Equal("XXXXXX", gb.Year);
Assert.Equal("XXXXXX", gb.Manufacturer);
Assert.Equal("XXXXXX", gb.History);
Assert.NotNull(gb.BiosSet);
var biosset = Assert.Single(gb.BiosSet);
Validate(biosset);
Assert.NotNull(gb.Rom);
var rom = Assert.Single(gb.Rom);
Validate(rom);
Assert.NotNull(gb.Disk);
var disk = Assert.Single(gb.Disk);
Validate(disk);
Assert.NotNull(gb.DeviceRef);
var deviceref = Assert.Single(gb.DeviceRef);
Validate(deviceref);
Assert.NotNull(gb.Sample);
var sample = Assert.Single(gb.Sample);
Validate(sample);
Assert.NotNull(gb.Chip);
var chip = Assert.Single(gb.Chip);
Validate(chip);
Assert.NotNull(gb.Display);
var display = Assert.Single(gb.Display);
Validate(display);
Assert.NotNull(gb.Video);
var video = Assert.Single(gb.Video);
Validate(video);
Validate(gb.Sound);
Validate(gb.Input);
Assert.NotNull(gb.DipSwitch);
var dipswitch = Assert.Single(gb.DipSwitch);
Validate(dipswitch);
Assert.NotNull(gb.Configuration);
var configuration = Assert.Single(gb.Configuration);
Validate(configuration);
Assert.NotNull(gb.Port);
var port = Assert.Single(gb.Port);
Validate(port);
Assert.NotNull(gb.Adjuster);
var adjuster = Assert.Single(gb.Adjuster);
Validate(adjuster);
Validate(gb.Driver);
Assert.NotNull(gb.Feature);
var feature = Assert.Single(gb.Feature);
Validate(feature);
Assert.NotNull(gb.Device);
var device = Assert.Single(gb.Device);
Validate(device);
Assert.NotNull(gb.Slot);
var slot = Assert.Single(gb.Slot);
Validate(slot);
Assert.NotNull(gb.SoftwareList);
var softwarelist = Assert.Single(gb.SoftwareList);
Validate(softwarelist);
Assert.NotNull(gb.RamOption);
var ramoption = Assert.Single(gb.RamOption);
Validate(ramoption);
}
/// <summary>
/// Validate a BiosSet
/// </summary>
private static void Validate(Models.Listxml.BiosSet? biosset)
{
Assert.NotNull(biosset);
Assert.Equal("XXXXXX", biosset.Name);
Assert.Equal("XXXXXX", biosset.Description);
Assert.Equal("XXXXXX", biosset.Default);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.Listxml.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Bios);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX", rom.SHA1);
Assert.Equal("XXXXXX", rom.Merge);
Assert.Equal("XXXXXX", rom.Region);
Assert.Equal("XXXXXX", rom.Offset);
Assert.Equal("XXXXXX", rom.Status);
Assert.Equal("XXXXXX", rom.Optional);
Assert.Equal("XXXXXX", rom.Dispose);
Assert.Equal("XXXXXX", rom.SoundOnly);
}
/// <summary>
/// Validate a Disk
/// </summary>
private static void Validate(Models.Listxml.Disk? disk)
{
Assert.NotNull(disk);
Assert.Equal("XXXXXX", disk.Name);
Assert.Equal("XXXXXX", disk.MD5);
Assert.Equal("XXXXXX", disk.SHA1);
Assert.Equal("XXXXXX", disk.Merge);
Assert.Equal("XXXXXX", disk.Region);
Assert.Equal("XXXXXX", disk.Index);
Assert.Equal("XXXXXX", disk.Writable);
Assert.Equal("XXXXXX", disk.Status);
Assert.Equal("XXXXXX", disk.Optional);
}
/// <summary>
/// Validate a DeviceRef
/// </summary>
private static void Validate(Models.Listxml.DeviceRef? deviceref)
{
Assert.NotNull(deviceref);
Assert.Equal("XXXXXX", deviceref.Name);
}
/// <summary>
/// Validate a Sample
/// </summary>
private static void Validate(Models.Listxml.Sample? sample)
{
Assert.NotNull(sample);
Assert.Equal("XXXXXX", sample.Name);
}
/// <summary>
/// Validate a Chip
/// </summary>
private static void Validate(Models.Listxml.Chip? chip)
{
Assert.NotNull(chip);
Assert.Equal("XXXXXX", chip.Name);
Assert.Equal("XXXXXX", chip.Tag);
Assert.Equal("XXXXXX", chip.Type);
Assert.Equal("XXXXXX", chip.SoundOnly);
Assert.Equal("XXXXXX", chip.Clock);
}
/// <summary>
/// Validate a Display
/// </summary>
private static void Validate(Models.Listxml.Display? display)
{
Assert.NotNull(display);
Assert.Equal("XXXXXX", display.Tag);
Assert.Equal("XXXXXX", display.Type);
Assert.Equal("XXXXXX", display.Rotate);
Assert.Equal("XXXXXX", display.FlipX);
Assert.Equal("XXXXXX", display.Width);
Assert.Equal("XXXXXX", display.Height);
Assert.Equal("XXXXXX", display.Refresh);
Assert.Equal("XXXXXX", display.PixClock);
Assert.Equal("XXXXXX", display.HTotal);
Assert.Equal("XXXXXX", display.HBEnd);
Assert.Equal("XXXXXX", display.HBStart);
Assert.Equal("XXXXXX", display.VTotal);
Assert.Equal("XXXXXX", display.VBEnd);
Assert.Equal("XXXXXX", display.VBStart);
}
/// <summary>
/// Validate a Video
/// </summary>
private static void Validate(Models.Listxml.Video? video)
{
Assert.NotNull(video);
Assert.Equal("XXXXXX", video.Screen);
Assert.Equal("XXXXXX", video.Orientation);
Assert.Equal("XXXXXX", video.Width);
Assert.Equal("XXXXXX", video.Height);
Assert.Equal("XXXXXX", video.AspectX);
Assert.Equal("XXXXXX", video.AspectY);
Assert.Equal("XXXXXX", video.Refresh);
}
/// <summary>
/// Validate a Sound
/// </summary>
private static void Validate(Models.Listxml.Sound? sound)
{
Assert.NotNull(sound);
Assert.Equal("XXXXXX", sound.Channels);
}
/// <summary>
/// Validate a Input
/// </summary>
private static void Validate(Models.Listxml.Input? input)
{
Assert.NotNull(input);
Assert.Equal("XXXXXX", input.Service);
Assert.Equal("XXXXXX", input.Tilt);
Assert.Equal("XXXXXX", input.Players);
//Assert.Equal("XXXXXX", input.ControlAttr); // Mututally exclusive with input.Control
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.NotNull(input.Control);
var control = Assert.Single(input.Control);
Validate(control);
}
/// <summary>
/// Validate a Control
/// </summary>
private static void Validate(Models.Listxml.Control? control)
{
Assert.NotNull(control);
Assert.Equal("XXXXXX", control.Type);
Assert.Equal("XXXXXX", control.Player);
Assert.Equal("XXXXXX", control.Buttons);
Assert.Equal("XXXXXX", control.ReqButtons);
Assert.Equal("XXXXXX", control.Minimum);
Assert.Equal("XXXXXX", control.Maximum);
Assert.Equal("XXXXXX", control.Sensitivity);
Assert.Equal("XXXXXX", control.KeyDelta);
Assert.Equal("XXXXXX", control.Reverse);
Assert.Equal("XXXXXX", control.Ways);
Assert.Equal("XXXXXX", control.Ways2);
Assert.Equal("XXXXXX", control.Ways3);
}
/// <summary>
/// Validate a DipSwitch
/// </summary>
private static void Validate(Models.Listxml.DipSwitch? dipswitch)
{
Assert.NotNull(dipswitch);
Assert.Equal("XXXXXX", dipswitch.Name);
Assert.Equal("XXXXXX", dipswitch.Tag);
Assert.Equal("XXXXXX", dipswitch.Mask);
Validate(dipswitch.Condition);
Assert.NotNull(dipswitch.DipLocation);
var diplocation = Assert.Single(dipswitch.DipLocation);
Validate(diplocation);
Assert.NotNull(dipswitch.DipValue);
var dipvalue = Assert.Single(dipswitch.DipValue);
Validate(dipvalue);
}
/// <summary>
/// Validate a Condition
/// </summary>
private static void Validate(Models.Listxml.Condition? condition)
{
Assert.NotNull(condition);
Assert.Equal("XXXXXX", condition.Tag);
Assert.Equal("XXXXXX", condition.Mask);
Assert.Equal("XXXXXX", condition.Relation);
Assert.Equal("XXXXXX", condition.Value);
}
/// <summary>
/// Validate a DipLocation
/// </summary>
private static void Validate(Models.Listxml.DipLocation? diplocation)
{
Assert.NotNull(diplocation);
Assert.Equal("XXXXXX", diplocation.Name);
Assert.Equal("XXXXXX", diplocation.Number);
Assert.Equal("XXXXXX", diplocation.Inverted);
}
/// <summary>
/// Validate a DipValue
/// </summary>
private static void Validate(Models.Listxml.DipValue? dipvalue)
{
Assert.NotNull(dipvalue);
Assert.Equal("XXXXXX", dipvalue.Name);
Assert.Equal("XXXXXX", dipvalue.Value);
Assert.Equal("XXXXXX", dipvalue.Default);
Validate(dipvalue.Condition);
}
/// <summary>
/// Validate a Configuration
/// </summary>
private static void Validate(Models.Listxml.Configuration? configuration)
{
Assert.NotNull(configuration);
Assert.Equal("XXXXXX", configuration.Name);
Assert.Equal("XXXXXX", configuration.Tag);
Assert.Equal("XXXXXX", configuration.Mask);
Validate(configuration.Condition);
Assert.NotNull(configuration.ConfLocation);
var conflocation = Assert.Single(configuration.ConfLocation);
Validate(conflocation);
Assert.NotNull(configuration.ConfSetting);
var confsetting = Assert.Single(configuration.ConfSetting);
Validate(confsetting);
}
/// <summary>
/// Validate a ConfLocation
/// </summary>
private static void Validate(Models.Listxml.ConfLocation? conflocation)
{
Assert.NotNull(conflocation);
Assert.Equal("XXXXXX", conflocation.Name);
Assert.Equal("XXXXXX", conflocation.Number);
Assert.Equal("XXXXXX", conflocation.Inverted);
}
/// <summary>
/// Validate a ConfSetting
/// </summary>
private static void Validate(Models.Listxml.ConfSetting? confsetting)
{
Assert.NotNull(confsetting);
Assert.Equal("XXXXXX", confsetting.Name);
Assert.Equal("XXXXXX", confsetting.Value);
Assert.Equal("XXXXXX", confsetting.Default);
Validate(confsetting.Condition);
}
/// <summary>
/// Validate a Port
/// </summary>
private static void Validate(Models.Listxml.Port? port)
{
Assert.NotNull(port);
Assert.Equal("XXXXXX", port.Tag);
Assert.NotNull(port.Analog);
var analog = Assert.Single(port.Analog);
Validate(analog);
}
/// <summary>
/// Validate a Analog
/// </summary>
private static void Validate(Models.Listxml.Analog? analog)
{
Assert.NotNull(analog);
Assert.Equal("XXXXXX", analog.Mask);
}
/// <summary>
/// Validate a Adjuster
/// </summary>
private static void Validate(Models.Listxml.Adjuster? adjuster)
{
Assert.NotNull(adjuster);
Assert.Equal("XXXXXX", adjuster.Name);
Assert.Equal("XXXXXX", adjuster.Default);
Validate(adjuster.Condition);
}
/// <summary>
/// Validate a Driver
/// </summary>
private static void Validate(Models.Listxml.Driver? driver)
{
Assert.NotNull(driver);
Assert.Equal("XXXXXX", driver.Status);
Assert.Equal("XXXXXX", driver.Color);
Assert.Equal("XXXXXX", driver.Sound);
Assert.Equal("XXXXXX", driver.PaletteSize);
Assert.Equal("XXXXXX", driver.Emulation);
Assert.Equal("XXXXXX", driver.Cocktail);
Assert.Equal("XXXXXX", driver.SaveState);
Assert.Equal("XXXXXX", driver.RequiresArtwork);
Assert.Equal("XXXXXX", driver.Unofficial);
Assert.Equal("XXXXXX", driver.NoSoundHardware);
Assert.Equal("XXXXXX", driver.Incomplete);
}
/// <summary>
/// Validate a Feature
/// </summary>
private static void Validate(Models.Listxml.Feature? feature)
{
Assert.NotNull(feature);
Assert.Equal("XXXXXX", feature.Type);
Assert.Equal("XXXXXX", feature.Status);
Assert.Equal("XXXXXX", feature.Overall);
}
/// <summary>
/// Validate a Device
/// </summary>
private static void Validate(Models.Listxml.Device? device)
{
Assert.NotNull(device);
Assert.Equal("XXXXXX", device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
Assert.Equal("XXXXXX", device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);
Assert.NotNull(device.Extension);
var extension = Assert.Single(device.Extension);
Validate(extension);
}
/// <summary>
/// Validate a Instance
/// </summary>
private static void Validate(Models.Listxml.Instance? instance)
{
Assert.NotNull(instance);
Assert.Equal("XXXXXX", instance.Name);
Assert.Equal("XXXXXX", instance.BriefName);
}
/// <summary>
/// Validate a Extension
/// </summary>
private static void Validate(Models.Listxml.Extension? extension)
{
Assert.NotNull(extension);
Assert.Equal("XXXXXX", extension.Name);
}
/// <summary>
/// Validate a Slot
/// </summary>
private static void Validate(Models.Listxml.Slot? slot)
{
Assert.NotNull(slot);
Assert.Equal("XXXXXX", slot.Name);
Assert.NotNull(slot.SlotOption);
var slotoption = Assert.Single(slot.SlotOption);
Validate(slotoption);
}
/// <summary>
/// Validate a SlotOption
/// </summary>
private static void Validate(Models.Listxml.SlotOption? slotoption)
{
Assert.NotNull(slotoption);
Assert.Equal("XXXXXX", slotoption.Name);
Assert.Equal("XXXXXX", slotoption.DevName);
Assert.Equal("XXXXXX", slotoption.Default);
}
/// <summary>
/// Validate a SoftwareList
/// </summary>
private static void Validate(Models.Listxml.SoftwareList? softwarelist)
{
Assert.NotNull(softwarelist);
Assert.Equal("XXXXXX", softwarelist.Tag);
Assert.Equal("XXXXXX", softwarelist.Name);
Assert.Equal("XXXXXX", softwarelist.Status);
Assert.Equal("XXXXXX", softwarelist.Filter);
}
/// <summary>
/// Validate a RamOption
/// </summary>
private static void Validate(Models.Listxml.RamOption? ramoption)
{
Assert.NotNull(ramoption);
Assert.Equal("XXXXXX", ramoption.Name);
Assert.Equal("XXXXXX", ramoption.Default);
Assert.Equal("XXXXXX", ramoption.Content);
}
}
}

View File

@@ -0,0 +1,614 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class LogiqxTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new Logiqx();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new Logiqx();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new Logiqx();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new Logiqx();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new Logiqx();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new Logiqx();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripGameTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Logiqx();
var serializer = new Serialization.Serializers.Logiqx();
// Build the data
Models.Logiqx.Datafile df = Build(game: true);
// Serialize to stream
Stream? metadata = serializer.Serialize(df);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Logiqx.Datafile? newDf = deserializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newDf);
Assert.Equal("XXXXXX", newDf.Build);
Assert.Equal("XXXXXX", newDf.Debug);
Assert.Equal("XXXXXX", newDf.SchemaLocation);
Validate(newDf.Header);
Assert.NotNull(newDf.Game);
var newGame = Assert.Single(newDf.Game);
Validate(newGame);
// TODO: Unsupported
Assert.Null(newDf.Dir);
}
[Fact]
public void RoundTripMachineTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.Logiqx();
var serializer = new Serialization.Serializers.Logiqx();
// Build the data
Models.Logiqx.Datafile df = Build(game: false);
// Serialize to stream
Stream? metadata = serializer.Serialize(df);
Assert.NotNull(metadata);
// Serialize back to original model
Models.Logiqx.Datafile? newDf = deserializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newDf);
Assert.Equal("XXXXXX", newDf.Build);
Assert.Equal("XXXXXX", newDf.Debug);
Assert.Equal("XXXXXX", newDf.SchemaLocation);
Validate(newDf.Header);
Assert.NotNull(newDf.Game);
var newGame = Assert.Single(newDf.Game);
Validate(newGame);
// TODO: Unsupported
Assert.Null(newDf.Dir);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.Logiqx.Datafile Build(bool game)
{
var clrmamepro = new Models.Logiqx.ClrMamePro
{
Header = "XXXXXX",
ForceMerging = "XXXXXX",
ForceNodump = "XXXXXX",
ForcePacking = "XXXXXX",
};
var romcenter = new Models.Logiqx.RomCenter
{
Plugin = "XXXXXX",
RomMode = "XXXXXX",
BiosMode = "XXXXXX",
SampleMode = "XXXXXX",
LockRomMode = "XXXXXX",
LockBiosMode = "XXXXXX",
LockSampleMode = "XXXXXX",
};
var header = new Models.Logiqx.Header
{
Id = "XXXXXX",
Name = "XXXXXX",
Description = "XXXXXX",
RootDir = "XXXXXX",
Category = "XXXXXX",
Version = "XXXXXX",
Date = "XXXXXX",
Author = "XXXXXX",
Email = "XXXXXX",
Homepage = "XXXXXX",
Url = "XXXXXX",
Comment = "XXXXXX",
Type = "XXXXXX",
ClrMamePro = clrmamepro,
RomCenter = romcenter,
};
var trurip = new Models.Logiqx.Trurip
{
TitleID = "XXXXXX",
Publisher = "XXXXXX",
Developer = "XXXXXX",
Year = "XXXXXX",
Genre = "XXXXXX",
Subgenre = "XXXXXX",
Ratings = "XXXXXX",
Score = "XXXXXX",
Players = "XXXXXX",
Enabled = "XXXXXX",
CRC = "XXXXXX",
Source = "XXXXXX",
CloneOf = "XXXXXX",
RelatedTo = "XXXXXX",
};
var release = new Models.Logiqx.Release
{
Name = "XXXXXX",
Region = "XXXXXX",
Language = "XXXXXX",
Date = "XXXXXX",
Default = "XXXXXX",
};
var biosset = new Models.Logiqx.BiosSet
{
Name = "XXXXXX",
Description = "XXXXXX",
Default = "XXXXXX",
};
var rom = new Models.Logiqx.Rom
{
Name = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
SHA256 = "XXXXXX",
SHA384 = "XXXXXX",
SHA512 = "XXXXXX",
SpamSum = "XXXXXX",
xxHash364 = "XXXXXX",
xxHash3128 = "XXXXXX",
Merge = "XXXXXX",
Status = "XXXXXX",
Serial = "XXXXXX",
Header = "XXXXXX",
Date = "XXXXXX",
Inverted = "XXXXXX",
MIA = "XXXXXX",
};
var disk = new Models.Logiqx.Disk
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Status = "XXXXXX",
Region = "XXXXXX",
};
var media = new Models.Logiqx.Media
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
SHA256 = "XXXXXX",
SpamSum = "XXXXXX",
};
var deviceRef = new Models.Logiqx.DeviceRef
{
Name = "XXXXXX",
};
var sample = new Models.Logiqx.Sample
{
Name = "XXXXXX",
};
var archive = new Models.Logiqx.Archive
{
Name = "XXXXXX",
};
var driver = new Models.Logiqx.Driver
{
Status = "XXXXXX",
Emulation = "XXXXXX",
Cocktail = "XXXXXX",
SaveState = "XXXXXX",
RequiresArtwork = "XXXXXX",
Unofficial = "XXXXXX",
NoSoundHardware = "XXXXXX",
Incomplete = "XXXXXX",
};
var softwarelist = new Models.Logiqx.SoftwareList
{
Tag = "XXXXXX",
Name = "XXXXXX",
Status = "XXXXXX",
Filter = "XXXXXX",
};
Models.Logiqx.GameBase gameBase = game
? new Models.Logiqx.Game()
: new Models.Logiqx.Machine();
gameBase.Name = "XXXXXX";
gameBase.SourceFile = "XXXXXX";
gameBase.IsBios = "XXXXXX";
gameBase.IsDevice = "XXXXXX";
gameBase.IsMechanical = "XXXXXX";
gameBase.CloneOf = "XXXXXX";
gameBase.RomOf = "XXXXXX";
gameBase.SampleOf = "XXXXXX";
gameBase.Board = "XXXXXX";
gameBase.RebuildTo = "XXXXXX";
gameBase.Id = "XXXXXX";
gameBase.CloneOfId = "XXXXXX";
gameBase.Runnable = "XXXXXX";
gameBase.Comment = ["XXXXXX"];
gameBase.Description = "XXXXXX";
gameBase.Year = "XXXXXX";
gameBase.Manufacturer = "XXXXXX";
gameBase.Publisher = "XXXXXX";
gameBase.Category = ["XXXXXX"];
gameBase.Trurip = trurip;
gameBase.Release = [release];
gameBase.BiosSet = [biosset];
gameBase.Rom = [rom];
gameBase.Disk = [disk];
gameBase.Media = [media];
gameBase.DeviceRef = [deviceRef];
gameBase.Sample = [sample];
gameBase.Archive = [archive];
gameBase.Driver = driver;
gameBase.SoftwareList = [softwarelist];
return new Models.Logiqx.Datafile
{
Build = "XXXXXX",
Debug = "XXXXXX",
SchemaLocation = "XXXXXX",
Header = header,
Game = [gameBase],
// Dir = [dir], // TODO: Unsupported
};
}
/// <summary>
/// Validate a Header
/// </summary>
private static void Validate(Models.Logiqx.Header? header)
{
Assert.NotNull(header);
Assert.Equal("XXXXXX", header.Id);
Assert.Equal("XXXXXX", header.Name);
Assert.Equal("XXXXXX", header.Description);
Assert.Equal("XXXXXX", header.RootDir);
Assert.Equal("XXXXXX", header.Category);
Assert.Equal("XXXXXX", header.Version);
Assert.Equal("XXXXXX", header.Date);
Assert.Equal("XXXXXX", header.Author);
Assert.Equal("XXXXXX", header.Email);
Assert.Equal("XXXXXX", header.Homepage);
Assert.Equal("XXXXXX", header.Url);
Assert.Equal("XXXXXX", header.Comment);
Assert.Equal("XXXXXX", header.Type);
Validate(header.ClrMamePro);
Validate(header.RomCenter);
}
/// <summary>
/// Validate a ClrMamePro
/// </summary>
private static void Validate(Models.Logiqx.ClrMamePro? cmp)
{
Assert.NotNull(cmp);
Assert.Equal("XXXXXX", cmp.Header);
Assert.Equal("XXXXXX", cmp.ForceMerging);
Assert.Equal("XXXXXX", cmp.ForceNodump);
Assert.Equal("XXXXXX", cmp.ForcePacking);
}
/// <summary>
/// Validate a RomCenter
/// </summary>
private static void Validate(Models.Logiqx.RomCenter? rc)
{
Assert.NotNull(rc);
Assert.Equal("XXXXXX", rc.Plugin);
Assert.Equal("XXXXXX", rc.RomMode);
Assert.Equal("XXXXXX", rc.BiosMode);
Assert.Equal("XXXXXX", rc.SampleMode);
Assert.Equal("XXXXXX", rc.LockRomMode);
Assert.Equal("XXXXXX", rc.LockBiosMode);
Assert.Equal("XXXXXX", rc.LockSampleMode);
}
/// <summary>
/// Validate a GameBase
/// </summary>
private static void Validate(Models.Logiqx.GameBase? gb)
{
Assert.NotNull(gb);
Assert.Equal("XXXXXX", gb.Name);
Assert.Equal("XXXXXX", gb.SourceFile);
Assert.Equal("XXXXXX", gb.IsBios);
Assert.Equal("XXXXXX", gb.IsDevice);
Assert.Equal("XXXXXX", gb.IsMechanical);
Assert.Equal("XXXXXX", gb.CloneOf);
Assert.Equal("XXXXXX", gb.RomOf);
Assert.Equal("XXXXXX", gb.SampleOf);
Assert.Equal("XXXXXX", gb.Board);
Assert.Equal("XXXXXX", gb.RebuildTo);
Assert.Equal("XXXXXX", gb.Id);
Assert.Equal("XXXXXX", gb.CloneOfId);
Assert.Equal("XXXXXX", gb.Runnable);
Assert.NotNull(gb.Comment);
string comment = Assert.Single(gb.Comment);
Assert.Equal("XXXXXX", comment);
Assert.Equal("XXXXXX", gb.Description);
Assert.Equal("XXXXXX", gb.Year);
Assert.Equal("XXXXXX", gb.Manufacturer);
Assert.Equal("XXXXXX", gb.Publisher);
Assert.NotNull(gb.Category);
string category = Assert.Single(gb.Category);
Assert.Equal("XXXXXX", category);
Validate(gb.Trurip);
Assert.NotNull(gb.Release);
var release = Assert.Single(gb.Release);
Validate(release);
Assert.NotNull(gb.BiosSet);
var biosset = Assert.Single(gb.BiosSet);
Validate(biosset);
Assert.NotNull(gb.Rom);
var rom = Assert.Single(gb.Rom);
Validate(rom);
Assert.NotNull(gb.Disk);
var disk = Assert.Single(gb.Disk);
Validate(disk);
Assert.NotNull(gb.Media);
var media = Assert.Single(gb.Media);
Validate(media);
Assert.NotNull(gb.DeviceRef);
var deviceref = Assert.Single(gb.DeviceRef);
Validate(deviceref);
Assert.NotNull(gb.Sample);
var sample = Assert.Single(gb.Sample);
Validate(sample);
Assert.NotNull(gb.Archive);
var archive = Assert.Single(gb.Archive);
Validate(archive);
Validate(gb.Driver);
Assert.NotNull(gb.SoftwareList);
var softwarelist = Assert.Single(gb.SoftwareList);
Validate(softwarelist);
}
/// <summary>
/// Validate a Trurip
/// </summary>
private static void Validate(Models.Logiqx.Trurip? trurip)
{
Assert.NotNull(trurip);
Assert.Equal("XXXXXX", trurip.TitleID);
Assert.Equal("XXXXXX", trurip.Publisher);
Assert.Equal("XXXXXX", trurip.Developer);
Assert.Equal("XXXXXX", trurip.Year);
Assert.Equal("XXXXXX", trurip.Genre);
Assert.Equal("XXXXXX", trurip.Subgenre);
Assert.Equal("XXXXXX", trurip.Ratings);
Assert.Equal("XXXXXX", trurip.Score);
Assert.Equal("XXXXXX", trurip.Players);
Assert.Equal("XXXXXX", trurip.Enabled);
Assert.Equal("XXXXXX", trurip.CRC);
Assert.Equal("XXXXXX", trurip.Source);
Assert.Equal("XXXXXX", trurip.CloneOf);
Assert.Equal("XXXXXX", trurip.RelatedTo);
}
/// <summary>
/// Validate a Release
/// </summary>
private static void Validate(Models.Logiqx.Release? release)
{
Assert.NotNull(release);
Assert.Equal("XXXXXX", release.Name);
Assert.Equal("XXXXXX", release.Region);
Assert.Equal("XXXXXX", release.Language);
Assert.Equal("XXXXXX", release.Date);
Assert.Equal("XXXXXX", release.Default);
}
/// <summary>
/// Validate a BiosSet
/// </summary>
private static void Validate(Models.Logiqx.BiosSet? biosset)
{
Assert.NotNull(biosset);
Assert.Equal("XXXXXX", biosset.Name);
Assert.Equal("XXXXXX", biosset.Description);
Assert.Equal("XXXXXX", biosset.Default);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.Logiqx.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX", rom.MD5);
Assert.Equal("XXXXXX", rom.SHA1);
Assert.Equal("XXXXXX", rom.SHA256);
Assert.Equal("XXXXXX", rom.SHA384);
Assert.Equal("XXXXXX", rom.SHA512);
Assert.Equal("XXXXXX", rom.SpamSum);
Assert.Equal("XXXXXX", rom.xxHash364);
Assert.Equal("XXXXXX", rom.xxHash3128);
Assert.Equal("XXXXXX", rom.Merge);
Assert.Equal("XXXXXX", rom.Status);
Assert.Equal("XXXXXX", rom.Serial);
Assert.Equal("XXXXXX", rom.Header);
Assert.Equal("XXXXXX", rom.Date);
Assert.Equal("XXXXXX", rom.Inverted);
Assert.Equal("XXXXXX", rom.MIA);
}
/// <summary>
/// Validate a Disk
/// </summary>
private static void Validate(Models.Logiqx.Disk? disk)
{
Assert.NotNull(disk);
Assert.Equal("XXXXXX", disk.Name);
Assert.Equal("XXXXXX", disk.MD5);
Assert.Equal("XXXXXX", disk.SHA1);
Assert.Equal("XXXXXX", disk.Merge);
Assert.Equal("XXXXXX", disk.Status);
Assert.Equal("XXXXXX", disk.Region);
}
/// <summary>
/// Validate a Media
/// </summary>
private static void Validate(Models.Logiqx.Media? media)
{
Assert.NotNull(media);
Assert.Equal("XXXXXX", media.Name);
Assert.Equal("XXXXXX", media.MD5);
Assert.Equal("XXXXXX", media.SHA1);
Assert.Equal("XXXXXX", media.SHA256);
Assert.Equal("XXXXXX", media.SpamSum);
}
/// <summary>
/// Validate a DeviceRef
/// </summary>
private static void Validate(Models.Logiqx.DeviceRef? deviceref)
{
Assert.NotNull(deviceref);
Assert.Equal("XXXXXX", deviceref.Name);
}
/// <summary>
/// Validate a Sample
/// </summary>
private static void Validate(Models.Logiqx.Sample? sample)
{
Assert.NotNull(sample);
Assert.Equal("XXXXXX", sample.Name);
}
/// <summary>
/// Validate a Archive
/// </summary>
private static void Validate(Models.Logiqx.Archive? archive)
{
Assert.NotNull(archive);
Assert.Equal("XXXXXX", archive.Name);
}
/// <summary>
/// Validate a Driver
/// </summary>
private static void Validate(Models.Logiqx.Driver? driver)
{
Assert.NotNull(driver);
Assert.Equal("XXXXXX", driver.Status);
Assert.Equal("XXXXXX", driver.Emulation);
Assert.Equal("XXXXXX", driver.Cocktail);
Assert.Equal("XXXXXX", driver.SaveState);
Assert.Equal("XXXXXX", driver.RequiresArtwork);
Assert.Equal("XXXXXX", driver.Unofficial);
Assert.Equal("XXXXXX", driver.NoSoundHardware);
Assert.Equal("XXXXXX", driver.Incomplete);
}
/// <summary>
/// Validate a SoftwareList
/// </summary>
private static void Validate(Models.Logiqx.SoftwareList? softwarelist)
{
Assert.NotNull(softwarelist);
Assert.Equal("XXXXXX", softwarelist.Tag);
Assert.Equal("XXXXXX", softwarelist.Name);
Assert.Equal("XXXXXX", softwarelist.Status);
Assert.Equal("XXXXXX", softwarelist.Filter);
}
}
}

View File

@@ -0,0 +1,940 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class M1Tests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new M1();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new M1();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new M1();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new M1();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new M1();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new M1();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripGameTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.M1();
var serializer = new Serialization.Serializers.M1();
// Build the data
Models.Listxml.M1 m1 = Build(game: true);
// Serialize to generic model
Stream? metadata = serializer.Serialize(m1);
Assert.NotNull(metadata);
// Serialize to stream
Models.Listxml.M1? newM1 = deserializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newM1);
Assert.Equal("XXXXXX", newM1.Version);
Assert.NotNull(newM1.Game);
var newGame = Assert.Single(newM1.Game);
Validate(newGame);
}
[Fact]
public void RoundTripMachineTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.M1();
var serializer = new Serialization.Serializers.M1();
// Build the data
Models.Listxml.M1 m1 = Build(game: false);
// Serialize to generic model
Stream? metadata = serializer.Serialize(m1);
Assert.NotNull(metadata);
// Serialize to stream
Models.Listxml.M1? newM1 = deserializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newM1);
Assert.Equal("XXXXXX", newM1.Version);
Assert.NotNull(newM1.Game);
var newGame = Assert.Single(newM1.Game);
Validate(newGame);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.Listxml.M1 Build(bool game)
{
var biosset = new Models.Listxml.BiosSet
{
Name = "XXXXXX",
Description = "XXXXXX",
Default = "XXXXXX",
};
var rom = new Models.Listxml.Rom
{
Name = "XXXXXX",
Bios = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Region = "XXXXXX",
Offset = "XXXXXX",
Status = "XXXXXX",
Optional = "XXXXXX",
Dispose = "XXXXXX",
SoundOnly = "XXXXXX",
};
var disk = new Models.Listxml.Disk
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Merge = "XXXXXX",
Region = "XXXXXX",
Index = "XXXXXX",
Writable = "XXXXXX",
Status = "XXXXXX",
Optional = "XXXXXX",
};
var deviceref = new Models.Listxml.DeviceRef
{
Name = "XXXXXX",
};
var sample = new Models.Listxml.Sample
{
Name = "XXXXXX",
};
var chip = new Models.Listxml.Chip
{
Name = "XXXXXX",
Tag = "XXXXXX",
Type = "XXXXXX",
SoundOnly = "XXXXXX",
Clock = "XXXXXX",
};
var display = new Models.Listxml.Display
{
Tag = "XXXXXX",
Type = "XXXXXX",
Rotate = "XXXXXX",
FlipX = "XXXXXX",
Width = "XXXXXX",
Height = "XXXXXX",
Refresh = "XXXXXX",
PixClock = "XXXXXX",
HTotal = "XXXXXX",
HBEnd = "XXXXXX",
HBStart = "XXXXXX",
VTotal = "XXXXXX",
VBEnd = "XXXXXX",
VBStart = "XXXXXX",
};
var video = new Models.Listxml.Video
{
Screen = "XXXXXX",
Orientation = "XXXXXX",
Width = "XXXXXX",
Height = "XXXXXX",
AspectX = "XXXXXX",
AspectY = "XXXXXX",
Refresh = "XXXXXX",
};
var sound = new Models.Listxml.Sound
{
Channels = "XXXXXX",
};
var control = new Models.Listxml.Control
{
Type = "XXXXXX",
Player = "XXXXXX",
Buttons = "XXXXXX",
ReqButtons = "XXXXXX",
Minimum = "XXXXXX",
Maximum = "XXXXXX",
Sensitivity = "XXXXXX",
KeyDelta = "XXXXXX",
Reverse = "XXXXXX",
Ways = "XXXXXX",
Ways2 = "XXXXXX",
Ways3 = "XXXXXX",
};
var input = new Models.Listxml.Input
{
Service = "XXXXXX",
Tilt = "XXXXXX",
Players = "XXXXXX",
//ControlAttr = "XXXXXX", // Mututally exclusive with input.Control
Buttons = "XXXXXX",
Coins = "XXXXXX",
Control = [control],
};
var condition = new Models.Listxml.Condition
{
Tag = "XXXXXX",
Mask = "XXXXXX",
Relation = "XXXXXX",
Value = "XXXXXX",
};
var diplocation = new Models.Listxml.DipLocation
{
Name = "XXXXXX",
Number = "XXXXXX",
Inverted = "XXXXXX",
};
var dipvalue = new Models.Listxml.DipValue
{
Name = "XXXXXX",
Value = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var dipswitch = new Models.Listxml.DipSwitch
{
Name = "XXXXXX",
Tag = "XXXXXX",
Mask = "XXXXXX",
Condition = condition,
DipLocation = [diplocation],
DipValue = [dipvalue],
};
var conflocation = new Models.Listxml.ConfLocation
{
Name = "XXXXXX",
Number = "XXXXXX",
Inverted = "XXXXXX",
};
var confsetting = new Models.Listxml.ConfSetting
{
Name = "XXXXXX",
Value = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var configuration = new Models.Listxml.Configuration
{
Name = "XXXXXX",
Tag = "XXXXXX",
Mask = "XXXXXX",
Condition = condition,
ConfLocation = [conflocation],
ConfSetting = [confsetting],
};
var analog = new Models.Listxml.Analog
{
Mask = "XXXXXX",
};
var port = new Models.Listxml.Port
{
Tag = "XXXXXX",
Analog = [analog],
};
var adjuster = new Models.Listxml.Adjuster
{
Name = "XXXXXX",
Default = "XXXXXX",
Condition = condition,
};
var driver = new Models.Listxml.Driver
{
Status = "XXXXXX",
Color = "XXXXXX",
Sound = "XXXXXX",
PaletteSize = "XXXXXX",
Emulation = "XXXXXX",
Cocktail = "XXXXXX",
SaveState = "XXXXXX",
RequiresArtwork = "XXXXXX",
Unofficial = "XXXXXX",
NoSoundHardware = "XXXXXX",
Incomplete = "XXXXXX",
};
var feature = new Models.Listxml.Feature
{
Type = "XXXXXX",
Status = "XXXXXX",
Overall = "XXXXXX",
};
var instance = new Models.Listxml.Instance
{
Name = "XXXXXX",
BriefName = "XXXXXX",
};
var extension = new Models.Listxml.Extension
{
Name = "XXXXXX",
};
var device = new Models.Listxml.Device
{
Type = "XXXXXX",
Tag = "XXXXXX",
FixedImage = "XXXXXX",
Mandatory = "XXXXXX",
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
};
var slotOption = new Models.Listxml.SlotOption
{
Name = "XXXXXX",
DevName = "XXXXXX",
Default = "XXXXXX",
};
var slot = new Models.Listxml.Slot
{
Name = "XXXXXX",
SlotOption = [slotOption],
};
var softwarelist = new Models.Listxml.SoftwareList
{
Tag = "XXXXXX",
Name = "XXXXXX",
Status = "XXXXXX",
Filter = "XXXXXX",
};
var ramoption = new Models.Listxml.RamOption
{
Name = "XXXXXX",
Default = "XXXXXX",
Content = "XXXXXX",
};
Models.Listxml.GameBase gameBase = game
? new Models.Listxml.Game()
: new Models.Listxml.Machine();
gameBase.Name = "XXXXXX";
gameBase.SourceFile = "XXXXXX";
gameBase.IsBios = "XXXXXX";
gameBase.IsDevice = "XXXXXX";
gameBase.IsMechanical = "XXXXXX";
gameBase.Runnable = "XXXXXX";
gameBase.CloneOf = "XXXXXX";
gameBase.RomOf = "XXXXXX";
gameBase.SampleOf = "XXXXXX";
gameBase.Description = "XXXXXX";
gameBase.Year = "XXXXXX";
gameBase.Manufacturer = "XXXXXX";
gameBase.History = "XXXXXX";
gameBase.BiosSet = [biosset];
gameBase.Rom = [rom];
gameBase.Disk = [disk];
gameBase.DeviceRef = [deviceref];
gameBase.Sample = [sample];
gameBase.Chip = [chip];
gameBase.Display = [display];
gameBase.Video = [video];
gameBase.Sound = sound;
gameBase.Input = input;
gameBase.DipSwitch = [dipswitch];
gameBase.Configuration = [configuration];
gameBase.Port = [port];
gameBase.Adjuster = [adjuster];
gameBase.Driver = driver;
gameBase.Feature = [feature];
gameBase.Device = [device];
gameBase.Slot = [slot];
gameBase.SoftwareList = [softwarelist];
gameBase.RamOption = [ramoption];
return new Models.Listxml.M1
{
Version = "XXXXXX",
Game = [gameBase],
};
}
/// <summary>
/// Validate a GameBase
/// </summary>
private static void Validate(Models.Listxml.GameBase? gb)
{
Assert.NotNull(gb);
Assert.Equal("XXXXXX", gb.Name);
Assert.Equal("XXXXXX", gb.SourceFile);
Assert.Equal("XXXXXX", gb.IsBios);
Assert.Equal("XXXXXX", gb.IsDevice);
Assert.Equal("XXXXXX", gb.IsMechanical);
Assert.Equal("XXXXXX", gb.Runnable);
Assert.Equal("XXXXXX", gb.CloneOf);
Assert.Equal("XXXXXX", gb.RomOf);
Assert.Equal("XXXXXX", gb.SampleOf);
Assert.Equal("XXXXXX", gb.Description);
Assert.Equal("XXXXXX", gb.Year);
Assert.Equal("XXXXXX", gb.Manufacturer);
Assert.Equal("XXXXXX", gb.History);
Assert.NotNull(gb.BiosSet);
var biosset = Assert.Single(gb.BiosSet);
Validate(biosset);
Assert.NotNull(gb.Rom);
var rom = Assert.Single(gb.Rom);
Validate(rom);
Assert.NotNull(gb.Disk);
var disk = Assert.Single(gb.Disk);
Validate(disk);
Assert.NotNull(gb.DeviceRef);
var deviceref = Assert.Single(gb.DeviceRef);
Validate(deviceref);
Assert.NotNull(gb.Sample);
var sample = Assert.Single(gb.Sample);
Validate(sample);
Assert.NotNull(gb.Chip);
var chip = Assert.Single(gb.Chip);
Validate(chip);
Assert.NotNull(gb.Display);
var display = Assert.Single(gb.Display);
Validate(display);
Assert.NotNull(gb.Video);
var video = Assert.Single(gb.Video);
Validate(video);
Validate(gb.Sound);
Validate(gb.Input);
Assert.NotNull(gb.DipSwitch);
var dipswitch = Assert.Single(gb.DipSwitch);
Validate(dipswitch);
Assert.NotNull(gb.Configuration);
var configuration = Assert.Single(gb.Configuration);
Validate(configuration);
Assert.NotNull(gb.Port);
var port = Assert.Single(gb.Port);
Validate(port);
Assert.NotNull(gb.Adjuster);
var adjuster = Assert.Single(gb.Adjuster);
Validate(adjuster);
Validate(gb.Driver);
Assert.NotNull(gb.Feature);
var feature = Assert.Single(gb.Feature);
Validate(feature);
Assert.NotNull(gb.Device);
var device = Assert.Single(gb.Device);
Validate(device);
Assert.NotNull(gb.Slot);
var slot = Assert.Single(gb.Slot);
Validate(slot);
Assert.NotNull(gb.SoftwareList);
var softwarelist = Assert.Single(gb.SoftwareList);
Validate(softwarelist);
Assert.NotNull(gb.RamOption);
var ramoption = Assert.Single(gb.RamOption);
Validate(ramoption);
}
/// <summary>
/// Validate a BiosSet
/// </summary>
private static void Validate(Models.Listxml.BiosSet? biosset)
{
Assert.NotNull(biosset);
Assert.Equal("XXXXXX", biosset.Name);
Assert.Equal("XXXXXX", biosset.Description);
Assert.Equal("XXXXXX", biosset.Default);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.Listxml.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Bios);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX", rom.SHA1);
Assert.Equal("XXXXXX", rom.Merge);
Assert.Equal("XXXXXX", rom.Region);
Assert.Equal("XXXXXX", rom.Offset);
Assert.Equal("XXXXXX", rom.Status);
Assert.Equal("XXXXXX", rom.Optional);
Assert.Equal("XXXXXX", rom.Dispose);
Assert.Equal("XXXXXX", rom.SoundOnly);
}
/// <summary>
/// Validate a Disk
/// </summary>
private static void Validate(Models.Listxml.Disk? disk)
{
Assert.NotNull(disk);
Assert.Equal("XXXXXX", disk.Name);
Assert.Equal("XXXXXX", disk.MD5);
Assert.Equal("XXXXXX", disk.SHA1);
Assert.Equal("XXXXXX", disk.Merge);
Assert.Equal("XXXXXX", disk.Region);
Assert.Equal("XXXXXX", disk.Index);
Assert.Equal("XXXXXX", disk.Writable);
Assert.Equal("XXXXXX", disk.Status);
Assert.Equal("XXXXXX", disk.Optional);
}
/// <summary>
/// Validate a DeviceRef
/// </summary>
private static void Validate(Models.Listxml.DeviceRef? deviceref)
{
Assert.NotNull(deviceref);
Assert.Equal("XXXXXX", deviceref.Name);
}
/// <summary>
/// Validate a Sample
/// </summary>
private static void Validate(Models.Listxml.Sample? sample)
{
Assert.NotNull(sample);
Assert.Equal("XXXXXX", sample.Name);
}
/// <summary>
/// Validate a Chip
/// </summary>
private static void Validate(Models.Listxml.Chip? chip)
{
Assert.NotNull(chip);
Assert.Equal("XXXXXX", chip.Name);
Assert.Equal("XXXXXX", chip.Tag);
Assert.Equal("XXXXXX", chip.Type);
Assert.Equal("XXXXXX", chip.SoundOnly);
Assert.Equal("XXXXXX", chip.Clock);
}
/// <summary>
/// Validate a Display
/// </summary>
private static void Validate(Models.Listxml.Display? display)
{
Assert.NotNull(display);
Assert.Equal("XXXXXX", display.Tag);
Assert.Equal("XXXXXX", display.Type);
Assert.Equal("XXXXXX", display.Rotate);
Assert.Equal("XXXXXX", display.FlipX);
Assert.Equal("XXXXXX", display.Width);
Assert.Equal("XXXXXX", display.Height);
Assert.Equal("XXXXXX", display.Refresh);
Assert.Equal("XXXXXX", display.PixClock);
Assert.Equal("XXXXXX", display.HTotal);
Assert.Equal("XXXXXX", display.HBEnd);
Assert.Equal("XXXXXX", display.HBStart);
Assert.Equal("XXXXXX", display.VTotal);
Assert.Equal("XXXXXX", display.VBEnd);
Assert.Equal("XXXXXX", display.VBStart);
}
/// <summary>
/// Validate a Video
/// </summary>
private static void Validate(Models.Listxml.Video? video)
{
Assert.NotNull(video);
Assert.Equal("XXXXXX", video.Screen);
Assert.Equal("XXXXXX", video.Orientation);
Assert.Equal("XXXXXX", video.Width);
Assert.Equal("XXXXXX", video.Height);
Assert.Equal("XXXXXX", video.AspectX);
Assert.Equal("XXXXXX", video.AspectY);
Assert.Equal("XXXXXX", video.Refresh);
}
/// <summary>
/// Validate a Sound
/// </summary>
private static void Validate(Models.Listxml.Sound? sound)
{
Assert.NotNull(sound);
Assert.Equal("XXXXXX", sound.Channels);
}
/// <summary>
/// Validate a Input
/// </summary>
private static void Validate(Models.Listxml.Input? input)
{
Assert.NotNull(input);
Assert.Equal("XXXXXX", input.Service);
Assert.Equal("XXXXXX", input.Tilt);
Assert.Equal("XXXXXX", input.Players);
//Assert.Equal("XXXXXX", input.ControlAttr); // Mututally exclusive with input.Control
Assert.Equal("XXXXXX", input.Buttons);
Assert.Equal("XXXXXX", input.Coins);
Assert.NotNull(input.Control);
var control = Assert.Single(input.Control);
Validate(control);
}
/// <summary>
/// Validate a Control
/// </summary>
private static void Validate(Models.Listxml.Control? control)
{
Assert.NotNull(control);
Assert.Equal("XXXXXX", control.Type);
Assert.Equal("XXXXXX", control.Player);
Assert.Equal("XXXXXX", control.Buttons);
Assert.Equal("XXXXXX", control.ReqButtons);
Assert.Equal("XXXXXX", control.Minimum);
Assert.Equal("XXXXXX", control.Maximum);
Assert.Equal("XXXXXX", control.Sensitivity);
Assert.Equal("XXXXXX", control.KeyDelta);
Assert.Equal("XXXXXX", control.Reverse);
Assert.Equal("XXXXXX", control.Ways);
Assert.Equal("XXXXXX", control.Ways2);
Assert.Equal("XXXXXX", control.Ways3);
}
/// <summary>
/// Validate a DipSwitch
/// </summary>
private static void Validate(Models.Listxml.DipSwitch? dipswitch)
{
Assert.NotNull(dipswitch);
Assert.Equal("XXXXXX", dipswitch.Name);
Assert.Equal("XXXXXX", dipswitch.Tag);
Assert.Equal("XXXXXX", dipswitch.Mask);
Validate(dipswitch.Condition);
Assert.NotNull(dipswitch.DipLocation);
var diplocation = Assert.Single(dipswitch.DipLocation);
Validate(diplocation);
Assert.NotNull(dipswitch.DipValue);
var dipvalue = Assert.Single(dipswitch.DipValue);
Validate(dipvalue);
}
/// <summary>
/// Validate a Condition
/// </summary>
private static void Validate(Models.Listxml.Condition? condition)
{
Assert.NotNull(condition);
Assert.Equal("XXXXXX", condition.Tag);
Assert.Equal("XXXXXX", condition.Mask);
Assert.Equal("XXXXXX", condition.Relation);
Assert.Equal("XXXXXX", condition.Value);
}
/// <summary>
/// Validate a DipLocation
/// </summary>
private static void Validate(Models.Listxml.DipLocation? diplocation)
{
Assert.NotNull(diplocation);
Assert.Equal("XXXXXX", diplocation.Name);
Assert.Equal("XXXXXX", diplocation.Number);
Assert.Equal("XXXXXX", diplocation.Inverted);
}
/// <summary>
/// Validate a DipValue
/// </summary>
private static void Validate(Models.Listxml.DipValue? dipvalue)
{
Assert.NotNull(dipvalue);
Assert.Equal("XXXXXX", dipvalue.Name);
Assert.Equal("XXXXXX", dipvalue.Value);
Assert.Equal("XXXXXX", dipvalue.Default);
Validate(dipvalue.Condition);
}
/// <summary>
/// Validate a Configuration
/// </summary>
private static void Validate(Models.Listxml.Configuration? configuration)
{
Assert.NotNull(configuration);
Assert.Equal("XXXXXX", configuration.Name);
Assert.Equal("XXXXXX", configuration.Tag);
Assert.Equal("XXXXXX", configuration.Mask);
Validate(configuration.Condition);
Assert.NotNull(configuration.ConfLocation);
var conflocation = Assert.Single(configuration.ConfLocation);
Validate(conflocation);
Assert.NotNull(configuration.ConfSetting);
var confsetting = Assert.Single(configuration.ConfSetting);
Validate(confsetting);
}
/// <summary>
/// Validate a ConfLocation
/// </summary>
private static void Validate(Models.Listxml.ConfLocation? conflocation)
{
Assert.NotNull(conflocation);
Assert.Equal("XXXXXX", conflocation.Name);
Assert.Equal("XXXXXX", conflocation.Number);
Assert.Equal("XXXXXX", conflocation.Inverted);
}
/// <summary>
/// Validate a ConfSetting
/// </summary>
private static void Validate(Models.Listxml.ConfSetting? confsetting)
{
Assert.NotNull(confsetting);
Assert.Equal("XXXXXX", confsetting.Name);
Assert.Equal("XXXXXX", confsetting.Value);
Assert.Equal("XXXXXX", confsetting.Default);
Validate(confsetting.Condition);
}
/// <summary>
/// Validate a Port
/// </summary>
private static void Validate(Models.Listxml.Port? port)
{
Assert.NotNull(port);
Assert.Equal("XXXXXX", port.Tag);
Assert.NotNull(port.Analog);
var analog = Assert.Single(port.Analog);
Validate(analog);
}
/// <summary>
/// Validate a Analog
/// </summary>
private static void Validate(Models.Listxml.Analog? analog)
{
Assert.NotNull(analog);
Assert.Equal("XXXXXX", analog.Mask);
}
/// <summary>
/// Validate a Adjuster
/// </summary>
private static void Validate(Models.Listxml.Adjuster? adjuster)
{
Assert.NotNull(adjuster);
Assert.Equal("XXXXXX", adjuster.Name);
Assert.Equal("XXXXXX", adjuster.Default);
Validate(adjuster.Condition);
}
/// <summary>
/// Validate a Driver
/// </summary>
private static void Validate(Models.Listxml.Driver? driver)
{
Assert.NotNull(driver);
Assert.Equal("XXXXXX", driver.Status);
Assert.Equal("XXXXXX", driver.Color);
Assert.Equal("XXXXXX", driver.Sound);
Assert.Equal("XXXXXX", driver.PaletteSize);
Assert.Equal("XXXXXX", driver.Emulation);
Assert.Equal("XXXXXX", driver.Cocktail);
Assert.Equal("XXXXXX", driver.SaveState);
Assert.Equal("XXXXXX", driver.RequiresArtwork);
Assert.Equal("XXXXXX", driver.Unofficial);
Assert.Equal("XXXXXX", driver.NoSoundHardware);
Assert.Equal("XXXXXX", driver.Incomplete);
}
/// <summary>
/// Validate a Feature
/// </summary>
private static void Validate(Models.Listxml.Feature? feature)
{
Assert.NotNull(feature);
Assert.Equal("XXXXXX", feature.Type);
Assert.Equal("XXXXXX", feature.Status);
Assert.Equal("XXXXXX", feature.Overall);
}
/// <summary>
/// Validate a Device
/// </summary>
private static void Validate(Models.Listxml.Device? device)
{
Assert.NotNull(device);
Assert.Equal("XXXXXX", device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
Assert.Equal("XXXXXX", device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);
Assert.NotNull(device.Extension);
var extension = Assert.Single(device.Extension);
Validate(extension);
}
/// <summary>
/// Validate a Instance
/// </summary>
private static void Validate(Models.Listxml.Instance? instance)
{
Assert.NotNull(instance);
Assert.Equal("XXXXXX", instance.Name);
Assert.Equal("XXXXXX", instance.BriefName);
}
/// <summary>
/// Validate a Extension
/// </summary>
private static void Validate(Models.Listxml.Extension? extension)
{
Assert.NotNull(extension);
Assert.Equal("XXXXXX", extension.Name);
}
/// <summary>
/// Validate a Slot
/// </summary>
private static void Validate(Models.Listxml.Slot? slot)
{
Assert.NotNull(slot);
Assert.Equal("XXXXXX", slot.Name);
Assert.NotNull(slot.SlotOption);
var slotoption = Assert.Single(slot.SlotOption);
Validate(slotoption);
}
/// <summary>
/// Validate a SlotOption
/// </summary>
private static void Validate(Models.Listxml.SlotOption? slotoption)
{
Assert.NotNull(slotoption);
Assert.Equal("XXXXXX", slotoption.Name);
Assert.Equal("XXXXXX", slotoption.DevName);
Assert.Equal("XXXXXX", slotoption.Default);
}
/// <summary>
/// Validate a SoftwareList
/// </summary>
private static void Validate(Models.Listxml.SoftwareList? softwarelist)
{
Assert.NotNull(softwarelist);
Assert.Equal("XXXXXX", softwarelist.Tag);
Assert.Equal("XXXXXX", softwarelist.Name);
Assert.Equal("XXXXXX", softwarelist.Status);
Assert.Equal("XXXXXX", softwarelist.Filter);
}
/// <summary>
/// Validate a RamOption
/// </summary>
private static void Validate(Models.Listxml.RamOption? ramoption)
{
Assert.NotNull(ramoption);
Assert.Equal("XXXXXX", ramoption.Name);
Assert.Equal("XXXXXX", ramoption.Default);
Assert.Equal("XXXXXX", ramoption.Content);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class MSDOSTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new MSDOS();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new MSDOS();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new MSDOS();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new MSDOS();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new MSDOS();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new MSDOS();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class MicrosoftCabinetTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new MicrosoftCabinet();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new MicrosoftCabinet();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new MicrosoftCabinet();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new MicrosoftCabinet();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new MicrosoftCabinet();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new MicrosoftCabinet();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class MoPaQTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new MoPaQ();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new MoPaQ();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new MoPaQ();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new MoPaQ();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new MoPaQ();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new MoPaQ();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class N3DSTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new N3DS();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new N3DS();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new N3DS();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new N3DS();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new N3DS();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new N3DS();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class NCFTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new NCF();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new NCF();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new NCF();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new NCF();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new NCF();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new NCF();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class NewExecutableTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new NewExecutable();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new NewExecutable();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new NewExecutable();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new NewExecutable();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new NewExecutable();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new NewExecutable();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class NitroTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new Nitro();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new Nitro();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new Nitro();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new Nitro();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new Nitro();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new Nitro();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,518 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class OfflineListTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new OfflineList();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new OfflineList();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new OfflineList();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new OfflineList();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new OfflineList();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new OfflineList();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.OfflineList();
var serializer = new Serialization.Serializers.OfflineList();
// Build the data
Models.OfflineList.Dat dat = Build();
// Serialize to stream
Stream? metadata = serializer.Serialize(dat);
Assert.NotNull(metadata);
// Serialize back to original model
Models.OfflineList.Dat? newDat = deserializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newDat);
Assert.Equal("XXXXXX", newDat.NoNamespaceSchemaLocation);
Validate(newDat.Configuration);
Validate(newDat.Games);
Validate(newDat.GUI);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.OfflineList.Dat Build()
{
var infos = new Models.OfflineList.Infos
{
Title = new Models.OfflineList.Title
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Location = new Models.OfflineList.Location
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Publisher = new Models.OfflineList.Publisher
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
SourceRom = new Models.OfflineList.SourceRom
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
SaveType = new Models.OfflineList.SaveType
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
RomSize = new Models.OfflineList.RomSize
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
ReleaseNumber = new Models.OfflineList.ReleaseNumber
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
ImageNumber = new Models.OfflineList.ImageNumber
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
LanguageNumber = new Models.OfflineList.LanguageNumber
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Comment = new Models.OfflineList.Comment
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
RomCRC = new Models.OfflineList.RomCRC
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Im1CRC = new Models.OfflineList.Im1CRC
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Im2CRC = new Models.OfflineList.Im2CRC
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
Languages = new Models.OfflineList.Languages
{
Visible = "XXXXXX",
InNamingOption = "XXXXXX",
Default = "XXXXXX",
},
};
var canopen = new Models.OfflineList.CanOpen
{
Extension = ["XXXXXX"],
};
var daturl = new Models.OfflineList.DatUrl
{
FileName = "XXXXXX",
Content = "XXXXXX",
};
var newdat = new Models.OfflineList.NewDat
{
DatVersionUrl = "XXXXXX",
DatUrl = daturl,
ImUrl = "XXXXXX",
};
var find = new Models.OfflineList.Find
{
Operation = "XXXXXX",
Value = "XXXXXX",
Content = "XXXXXX",
};
var to = new Models.OfflineList.To
{
Value = "XXXXXX",
Default = "XXXXXX",
Auto = "XXXXXX",
Find = [find],
};
var search = new Models.OfflineList.Search
{
To = [to],
};
var configuration = new Models.OfflineList.Configuration
{
DatName = "XXXXXX",
ImFolder = "XXXXXX",
DatVersion = "XXXXXX",
System = "XXXXXX",
ScreenshotsWidth = "XXXXXX",
ScreenshotsHeight = "XXXXXX",
Infos = infos,
CanOpen = canopen,
NewDat = newdat,
Search = search,
RomTitle = "XXXXXX",
};
var fileromcrc = new Models.OfflineList.FileRomCRC
{
Extension = "XXXXXX",
Content = "XXXXXX",
};
var files = new Models.OfflineList.Files
{
RomCRC = [fileromcrc],
};
var game = new Models.OfflineList.Game
{
ImageNumber = "XXXXXX",
ReleaseNumber = "XXXXXX",
Title = "XXXXXX",
SaveType = "XXXXXX",
RomSize = "XXXXXX",
Publisher = "XXXXXX",
Location = "XXXXXX",
SourceRom = "XXXXXX",
Language = "XXXXXX",
Files = files,
Im1CRC = "XXXXXX",
Im2CRC = "XXXXXX",
Comment = "XXXXXX",
DuplicateID = "XXXXXX",
};
var games = new Models.OfflineList.Games
{
Game = [game],
};
var image = new Models.OfflineList.Image
{
X = "XXXXXX",
Y = "XXXXXX",
Width = "XXXXXX",
Height = "XXXXXX",
};
var images = new Models.OfflineList.Images
{
Width = "XXXXXX",
Height = "XXXXXX",
Image = [image],
};
var gui = new Models.OfflineList.GUI
{
Images = images,
};
return new Models.OfflineList.Dat
{
NoNamespaceSchemaLocation = "XXXXXX",
Configuration = configuration,
Games = games,
GUI = gui,
};
}
/// <summary>
/// Validate a Configuration
/// </summary>
private static void Validate(Models.OfflineList.Configuration? configuration)
{
Assert.NotNull(configuration);
Assert.Equal("XXXXXX", configuration.DatName);
Assert.Equal("XXXXXX", configuration.ImFolder);
Assert.Equal("XXXXXX", configuration.DatVersion);
Assert.Equal("XXXXXX", configuration.System);
Assert.Equal("XXXXXX", configuration.ScreenshotsWidth);
Assert.Equal("XXXXXX", configuration.ScreenshotsHeight);
Validate(configuration.Infos);
Validate(configuration.CanOpen);
Validate(configuration.NewDat);
Validate(configuration.Search);
Assert.Equal("XXXXXX", configuration.RomTitle);
}
/// <summary>
/// Validate a Infos
/// </summary>
private static void Validate(Models.OfflineList.Infos? infos)
{
Assert.NotNull(infos);
Validate(infos.Title);
Validate(infos.Location);
Validate(infos.Publisher);
Validate(infos.SourceRom);
Validate(infos.SaveType);
Validate(infos.RomSize);
Validate(infos.ReleaseNumber);
Validate(infos.ImageNumber);
Validate(infos.LanguageNumber);
Validate(infos.Comment);
Validate(infos.RomCRC);
Validate(infos.Im1CRC);
Validate(infos.Im2CRC);
Validate(infos.Languages);
}
/// <summary>
/// Validate a InfoBase
/// </summary>
private static void Validate(Models.OfflineList.InfoBase? info)
{
Assert.NotNull(info);
Assert.Equal("XXXXXX", info.Visible);
Assert.Equal("XXXXXX", info.InNamingOption);
Assert.Equal("XXXXXX", info.Default);
}
/// <summary>
/// Validate a CanOpen
/// </summary>
private static void Validate(Models.OfflineList.CanOpen? canopen)
{
Assert.NotNull(canopen);
Assert.NotNull(canopen.Extension);
string extension = Assert.Single(canopen.Extension);
Assert.Equal("XXXXXX", extension);
}
/// <summary>
/// Validate a NewDat
/// </summary>
private static void Validate(Models.OfflineList.NewDat? newdat)
{
Assert.NotNull(newdat);
Assert.Equal("XXXXXX", newdat.DatVersionUrl);
Validate(newdat.DatUrl);
Assert.Equal("XXXXXX", newdat.ImUrl);
}
/// <summary>
/// Validate a DatUrl
/// </summary>
private static void Validate(Models.OfflineList.DatUrl? daturl)
{
Assert.NotNull(daturl);
Assert.Equal("XXXXXX", daturl.FileName);
Assert.Equal("XXXXXX", daturl.Content);
}
/// <summary>
/// Validate a Search
/// </summary>
private static void Validate(Models.OfflineList.Search? search)
{
Assert.NotNull(search);
Assert.NotNull(search.To);
var to = Assert.Single(search.To);
Validate(to);
}
/// <summary>
/// Validate a To
/// </summary>
private static void Validate(Models.OfflineList.To? to)
{
Assert.NotNull(to);
Assert.Equal("XXXXXX", to.Value);
Assert.Equal("XXXXXX", to.Default);
Assert.Equal("XXXXXX", to.Auto);
Assert.NotNull(to.Find);
var find = Assert.Single(to.Find);
Validate(find);
}
/// <summary>
/// Validate a Find
/// </summary>
private static void Validate(Models.OfflineList.Find? find)
{
Assert.NotNull(find);
Assert.Equal("XXXXXX", find.Operation);
Assert.Equal("XXXXXX", find.Value);
Assert.Equal("XXXXXX", find.Content);
}
/// <summary>
/// Validate a Games
/// </summary>
private static void Validate(Models.OfflineList.Games? games)
{
Assert.NotNull(games);
Assert.NotNull(games.Game);
var game = Assert.Single(games.Game);
Validate(game);
}
/// <summary>
/// Validate a Game
/// </summary>
private static void Validate(Models.OfflineList.Game? game)
{
Assert.NotNull(game);
Assert.Equal("XXXXXX", game.ImageNumber);
Assert.Equal("XXXXXX", game.ReleaseNumber);
Assert.Equal("XXXXXX", game.Title);
Assert.Equal("XXXXXX", game.SaveType);
Assert.Equal("XXXXXX", game.RomSize);
Assert.Equal("XXXXXX", game.Publisher);
Assert.Equal("XXXXXX", game.Location);
Assert.Equal("XXXXXX", game.SourceRom);
Assert.Equal("XXXXXX", game.Language);
Validate(game.Files);
Assert.Equal("XXXXXX", game.Im1CRC);
Assert.Equal("XXXXXX", game.Im2CRC);
Assert.Equal("XXXXXX", game.Comment);
Assert.Equal("XXXXXX", game.DuplicateID);
}
/// <summary>
/// Validate a Files
/// </summary>
private static void Validate(Models.OfflineList.Files? files)
{
Assert.NotNull(files);
Assert.NotNull(files.RomCRC);
var fileromcrc = Assert.Single(files.RomCRC);
Validate(fileromcrc);
}
/// <summary>
/// Validate a FileRomCRC
/// </summary>
private static void Validate(Models.OfflineList.FileRomCRC? fileromcrc)
{
Assert.NotNull(fileromcrc);
Assert.Equal("XXXXXX", fileromcrc.Extension);
Assert.Equal("XXXXXX", fileromcrc.Content);
}
/// <summary>
/// Validate a GUI
/// </summary>
private static void Validate(Models.OfflineList.GUI? gui)
{
Assert.NotNull(gui);
Validate(gui.Images);
}
/// <summary>
/// Validate a Images
/// </summary>
private static void Validate(Models.OfflineList.Images? images)
{
Assert.NotNull(images);
Assert.Equal("XXXXXX", images.Width);
Assert.Equal("XXXXXX", images.Height);
Assert.NotNull(images.Image);
var image = Assert.Single(images.Image);
Validate(image);
}
/// <summary>
/// Validate a Image
/// </summary>
private static void Validate(Models.OfflineList.Image? image)
{
Assert.NotNull(image);
Assert.Equal("XXXXXX", image.X);
Assert.Equal("XXXXXX", image.Y);
Assert.Equal("XXXXXX", image.Width);
Assert.Equal("XXXXXX", image.Height);
}
}
}

View File

@@ -0,0 +1,224 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class OpenMSXTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new OpenMSX();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new OpenMSX();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new OpenMSX();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new OpenMSX();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new OpenMSX();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new OpenMSX();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.OpenMSX();
var serializer = new Serialization.Serializers.OpenMSX();
// Build the data
Models.OpenMSX.SoftwareDb sdb = Build();
// Serialize to stream
Stream? metadata = serializer.Serialize(sdb);
Assert.NotNull(metadata);
// Serialize back to original model
Models.OpenMSX.SoftwareDb? newSdb = deserializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newSdb);
Assert.Equal("XXXXXX", newSdb.Timestamp);
Assert.NotNull(newSdb.Software);
var software = Assert.Single(newSdb.Software);
Validate(software);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.OpenMSX.SoftwareDb Build()
{
var original = new Models.OpenMSX.Original
{
Value = "XXXXXX",
Content = "XXXXXX",
};
var rom = new Models.OpenMSX.Rom
{
Start = "XXXXXX",
Type = "XXXXXX",
Hash = "XXXXXX",
Remark = "XXXXXX",
};
var dump_rom = new Models.OpenMSX.Dump
{
Original = original,
Rom = rom,
};
var megarom = new Models.OpenMSX.MegaRom
{
Start = "XXXXXX",
Type = "XXXXXX",
Hash = "XXXXXX",
Remark = "XXXXXX",
};
var dump_megarom = new Models.OpenMSX.Dump
{
Original = original,
Rom = megarom,
};
var sccpluscart = new Models.OpenMSX.SCCPlusCart
{
Start = "XXXXXX",
Type = "XXXXXX",
Hash = "XXXXXX",
Remark = "XXXXXX",
};
var dump_sccpluscart = new Models.OpenMSX.Dump
{
Original = original,
Rom = sccpluscart,
};
var software = new Models.OpenMSX.Software
{
Title = "XXXXXX",
GenMSXID = "XXXXXX",
System = "XXXXXX",
Company = "XXXXXX",
Year = "XXXXXX",
Country = "XXXXXX",
Dump = [dump_rom, dump_megarom, dump_sccpluscart],
};
return new Models.OpenMSX.SoftwareDb
{
Timestamp = "XXXXXX",
Software = [software],
};
}
/// <summary>
/// Validate a Software
/// </summary>
private static void Validate(Models.OpenMSX.Software? software)
{
Assert.NotNull(software);
Assert.Equal("XXXXXX", software.Title);
Assert.Equal("XXXXXX", software.GenMSXID);
Assert.Equal("XXXXXX", software.System);
Assert.Equal("XXXXXX", software.Company);
Assert.Equal("XXXXXX", software.Year);
Assert.Equal("XXXXXX", software.Country);
Assert.NotNull(software.Dump);
Assert.Equal(3, software.Dump.Length);
foreach (var dump in software.Dump)
{
Validate(dump);
}
}
/// <summary>
/// Validate a Dump
/// </summary>
private static void Validate(Models.OpenMSX.Dump? dump)
{
Assert.NotNull(dump);
Validate(dump.Original);
Validate(dump.Rom);
}
/// <summary>
/// Validate a Original
/// </summary>
private static void Validate(Models.OpenMSX.Original? original)
{
Assert.NotNull(original);
Assert.Equal("XXXXXX", original.Value);
Assert.Equal("XXXXXX", original.Content);
}
/// <summary>
/// Validate a RomBase
/// </summary>
private static void Validate(Models.OpenMSX.RomBase? rombase)
{
Assert.NotNull(rombase);
Assert.Equal("XXXXXX", rombase.Start);
Assert.Equal("XXXXXX", rombase.Type);
Assert.Equal("XXXXXX", rombase.Hash);
Assert.Equal("XXXXXX", rombase.Remark);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class PAKTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new PAK();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new PAK();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new PAK();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new PAK();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new PAK();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new PAK();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class PFFTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new PFF();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new PFF();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new PFF();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new PFF();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new PFF();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new PFF();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class PICTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new PIC();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new PIC();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new PIC();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new PIC();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new PIC();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new PIC();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class PKZIPTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new PKZIP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new PKZIP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new PKZIP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new PKZIP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new PKZIP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new PKZIP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class PlayJAudioTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new PlayJAudio();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new PlayJAudio();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new PlayJAudio();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new PlayJAudio();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new PlayJAudio();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new PlayJAudio();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class PlayJPlaylistTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new PlayJPlaylist();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new PlayJPlaylist();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new PlayJPlaylist();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new PlayJPlaylist();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new PlayJPlaylist();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new PlayJPlaylist();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class PortableExecutableTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new PortableExecutable();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new PortableExecutable();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new PortableExecutable();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new PortableExecutable();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new PortableExecutable();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new PortableExecutable();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class QuantumTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new Quantum();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new Quantum();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new Quantum();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new Quantum();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new Quantum();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new Quantum();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,221 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class RomCenterTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new RomCenter();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new RomCenter();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new RomCenter();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new RomCenter();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new RomCenter();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new RomCenter();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.RomCenter();
var serializer = new Serialization.Serializers.RomCenter();
// Build the data
Models.RomCenter.MetadataFile mf = Build();
// Serialize to stream
Stream? metadata = serializer.Serialize(mf);
Assert.NotNull(metadata);
// Serialize back to original model
Models.RomCenter.MetadataFile? newMf = deserializer.Deserialize(metadata);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.Credits);
Validate(newMf.Dat);
Validate(newMf.Emulator);
Validate(newMf.Games);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.RomCenter.MetadataFile Build()
{
var credits = new Models.RomCenter.Credits
{
Author = "XXXXXX",
Version = "XXXXXX",
Email = "XXXXXX",
Homepage = "XXXXXX",
Url = "XXXXXX",
Date = "XXXXXX",
Comment = "XXXXXX",
};
var dat = new Models.RomCenter.Dat
{
Version = "XXXXXX",
Plugin = "XXXXXX",
Split = "XXXXXX",
Merge = "XXXXXX",
};
var emulator = new Models.RomCenter.Emulator
{
RefName = "XXXXXX",
Version = "XXXXXX",
};
var rom = new Models.RomCenter.Rom
{
ParentName = "XXXXXX",
ParentDescription = "XXXXXX",
GameName = "XXXXXX",
GameDescription = "XXXXXX",
RomName = "XXXXXX",
RomCRC = "XXXXXX",
RomSize = "XXXXXX",
RomOf = "XXXXXX",
MergeName = "XXXXXX",
};
var games = new Models.RomCenter.Games
{
Rom = [rom],
};
return new Models.RomCenter.MetadataFile
{
Credits = credits,
Dat = dat,
Emulator = emulator,
Games = games,
};
}
/// <summary>
/// Validate a Credits
/// </summary>
private static void Validate(Models.RomCenter.Credits? credits)
{
Assert.NotNull(credits);
Assert.Equal("XXXXXX", credits.Author);
Assert.Equal("XXXXXX", credits.Version);
Assert.Equal("XXXXXX", credits.Email);
Assert.Equal("XXXXXX", credits.Homepage);
Assert.Equal("XXXXXX", credits.Url);
Assert.Equal("XXXXXX", credits.Date);
Assert.Equal("XXXXXX", credits.Comment);
}
/// <summary>
/// Validate a Dat
/// </summary>
private static void Validate(Models.RomCenter.Dat? dat)
{
Assert.NotNull(dat);
Assert.Equal("XXXXXX", dat.Version);
Assert.Equal("XXXXXX", dat.Plugin);
Assert.Equal("XXXXXX", dat.Split);
Assert.Equal("XXXXXX", dat.Merge);
}
/// <summary>
/// Validate a Emulator
/// </summary>
private static void Validate(Models.RomCenter.Emulator? emulator)
{
Assert.NotNull(emulator);
Assert.Equal("XXXXXX", emulator.RefName);
Assert.Equal("XXXXXX", emulator.Version);
}
/// <summary>
/// Validate a Games
/// </summary>
private static void Validate(Models.RomCenter.Games? games)
{
Assert.NotNull(games);
Assert.NotNull(games.Rom);
var rom = Assert.Single(games.Rom);
Validate(rom);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.RomCenter.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.ParentName);
Assert.Equal("XXXXXX", rom.ParentDescription);
Assert.Equal("XXXXXX", rom.GameName);
Assert.Equal("XXXXXX", rom.GameDescription);
Assert.Equal("XXXXXX", rom.RomName);
Assert.Equal("XXXXXX", rom.RomCRC);
Assert.Equal("XXXXXX", rom.RomSize);
Assert.Equal("XXXXXX", rom.RomOf);
Assert.Equal("XXXXXX", rom.MergeName);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class SFBTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new SFB();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new SFB();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new SFB();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new SFB();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new SFB();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new SFB();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class SFOTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new SFO();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new SFO();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new SFO();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new SFO();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new SFO();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new SFO();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class SGATests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new SGA();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new SGA();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new SGA();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new SGA();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new SGA();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new SGA();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,308 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class SeparatedValueTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new SeparatedValue();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new SeparatedValue();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new SeparatedValue();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new SeparatedValue();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new SeparatedValue();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new SeparatedValue();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripShortTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.SeparatedValue();
var serializer = new Serialization.Serializers.SeparatedValue();
// Build the data
Models.SeparatedValue.MetadataFile mf = Build();
// Serialize to stream
Stream? actual = Serialization.Serializers.SeparatedValue.SerializeStream(mf, longHeader: false);
Assert.NotNull(actual);
// Serialize back to original model
Models.SeparatedValue.MetadataFile? newMf = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.Header, longHeader: false);
Assert.NotNull(newMf.Row);
Assert.Equal(3, newMf.Row.Length);
ValidateDisk(newMf.Row[0], longHeader: false);
ValidateMedia(newMf.Row[1], longHeader: false);
ValidateRom(newMf.Row[2], longHeader: false);
}
[Fact]
public void RoundTripLongTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.SeparatedValue();
var serializer = new Serialization.Serializers.SeparatedValue();
// Build the data
Models.SeparatedValue.MetadataFile mf = Build();
// Serialize to stream
Stream? actual = Serialization.Serializers.SeparatedValue.SerializeStream(mf, longHeader: true);
Assert.NotNull(actual);
// Serialize back to original model
Models.SeparatedValue.MetadataFile? newMf = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newMf);
Validate(newMf.Header, longHeader: true);
Assert.NotNull(newMf.Row);
Assert.Equal(3, newMf.Row.Length);
ValidateDisk(newMf.Row[0], longHeader: true);
ValidateMedia(newMf.Row[1], longHeader: true);
ValidateRom(newMf.Row[2], longHeader: true);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.SeparatedValue.MetadataFile Build()
{
string[] header = ["header"];
var disk = new Models.SeparatedValue.Row
{
FileName = "XXXXXX",
InternalName = "XXXXXX",
Description = "XXXXXX",
GameName = "XXXXXX",
GameDescription = "XXXXXX",
Type = "disk",
DiskName = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Status = "XXXXXX",
};
var media = new Models.SeparatedValue.Row
{
FileName = "XXXXXX",
InternalName = "XXXXXX",
Description = "XXXXXX",
GameName = "XXXXXX",
GameDescription = "XXXXXX",
Type = "media",
DiskName = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
SHA256 = "XXXXXX",
SpamSum = "XXXXXX",
};
var rom = new Models.SeparatedValue.Row
{
FileName = "XXXXXX",
InternalName = "XXXXXX",
Description = "XXXXXX",
GameName = "XXXXXX",
GameDescription = "XXXXXX",
Type = "rom",
RomName = "XXXXXX",
Size = "XXXXXX",
CRC = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
SHA256 = "XXXXXX",
SHA384 = "XXXXXX",
SHA512 = "XXXXXX",
SpamSum = "XXXXXX",
Status = "XXXXXX",
};
return new Models.SeparatedValue.MetadataFile
{
Header = header,
Row = [disk, media, rom],
};
}
/// <summary>
/// Validate a header
/// </summary>
private static void Validate(string[]? header, bool longHeader)
{
Assert.NotNull(header);
if (longHeader)
Assert.True(Serialization.Serializers.SeparatedValue.HeaderArrayExtended.SequenceEqual(header));
else
Assert.True(Serialization.Serializers.SeparatedValue.HeaderArrayStandard.SequenceEqual(header));
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateDisk(Models.SeparatedValue.Row? row, bool longHeader)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.FileName);
Assert.Equal("XXXXXX", row.InternalName);
Assert.Equal("XXXXXX", row.Description);
Assert.Equal("XXXXXX", row.GameName);
Assert.Equal("XXXXXX", row.GameDescription);
Assert.Equal("disk", row.Type);
Assert.NotNull(row.RomName); Assert.Empty(row.RomName);
Assert.Equal("XXXXXX", row.DiskName);
Assert.NotNull(row.Size); Assert.Empty(row.Size);
Assert.NotNull(row.CRC); Assert.Empty(row.CRC);
Assert.Equal("XXXXXX", row.MD5);
Assert.Equal("XXXXXX", row.SHA1);
Assert.NotNull(row.CRC); Assert.Empty(row.CRC);
if (longHeader)
{
Assert.NotNull(row.SHA384); Assert.Empty(row.SHA384);
Assert.NotNull(row.SHA512); Assert.Empty(row.SHA512);
Assert.NotNull(row.SpamSum); Assert.Empty(row.SpamSum);
}
else
{
Assert.Null(row.SHA384);
Assert.Null(row.SHA512);
Assert.Null(row.SpamSum);
}
Assert.Equal("XXXXXX", row.Status);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateMedia(Models.SeparatedValue.Row? row, bool longHeader)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.FileName);
Assert.Equal("XXXXXX", row.InternalName);
Assert.Equal("XXXXXX", row.Description);
Assert.Equal("XXXXXX", row.GameName);
Assert.Equal("XXXXXX", row.GameDescription);
Assert.Equal("media", row.Type);
Assert.NotNull(row.RomName); Assert.Empty(row.RomName);
Assert.Equal("XXXXXX", row.DiskName);
Assert.NotNull(row.Size); Assert.Empty(row.Size);
Assert.NotNull(row.CRC); Assert.Empty(row.CRC);
Assert.Equal("XXXXXX", row.MD5);
Assert.Equal("XXXXXX", row.SHA1);
Assert.Equal("XXXXXX", row.SHA256);
if (longHeader)
{
Assert.NotNull(row.SHA384); Assert.Empty(row.SHA384);
Assert.NotNull(row.SHA512); Assert.Empty(row.SHA512);
Assert.Equal("XXXXXX", row.SpamSum);
}
else
{
Assert.Null(row.SHA384);
Assert.Null(row.SHA512);
Assert.Null(row.SpamSum);
}
Assert.NotNull(row.Status); Assert.Empty(row.Status);
}
/// <summary>
/// Validate a Row
/// </summary>
private static void ValidateRom(Models.SeparatedValue.Row? row, bool longHeader)
{
Assert.NotNull(row);
Assert.Equal("XXXXXX", row.FileName);
Assert.Equal("XXXXXX", row.InternalName);
Assert.Equal("XXXXXX", row.Description);
Assert.Equal("XXXXXX", row.GameName);
Assert.Equal("XXXXXX", row.GameDescription);
Assert.Equal("rom", row.Type);
Assert.Equal("XXXXXX", row.RomName);
Assert.NotNull(row.DiskName);
Assert.Empty(row.DiskName);
Assert.Equal("XXXXXX", row.Size);
Assert.Equal("XXXXXX", row.CRC);
Assert.Equal("XXXXXX", row.MD5);
Assert.Equal("XXXXXX", row.SHA1);
Assert.Equal("XXXXXX", row.SHA256);
if (longHeader)
{
Assert.Equal("XXXXXX", row.SHA384);
Assert.Equal("XXXXXX", row.SHA512);
Assert.Equal("XXXXXX", row.SpamSum);
}
else
{
Assert.Null(row.SHA384);
Assert.Null(row.SHA512);
Assert.Null(row.SpamSum);
}
Assert.Equal("XXXXXX", row.Status);
}
}
}

View File

@@ -0,0 +1,378 @@
using System;
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class SoftwareListTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new SoftwareList();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new SoftwareList();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new SoftwareList();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new SoftwareList();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new SoftwareList();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new SoftwareList();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void RoundTripTest()
{
// Get the serializer and deserializer
var deserializer = new Serialization.Deserializers.SoftwareList();
var serializer = new Serialization.Serializers.SoftwareList();
// Build the data
Models.SoftwareList.SoftwareList sl = Build();
// Serialize to stream
Stream? actual = serializer.Serialize(sl);
Assert.NotNull(actual);
// Serialize back to original model
Models.SoftwareList.SoftwareList? newSl = deserializer.Deserialize(actual);
// Validate the data
Assert.NotNull(newSl);
Assert.Equal("XXXXXX", newSl.Name);
Assert.Equal("XXXXXX", newSl.Description);
Assert.Equal("XXXXXX", newSl.Notes);
Assert.NotNull(newSl.Software);
var newSoftware = Assert.Single(newSl.Software);
Validate(newSoftware);
}
/// <summary>
/// Build model for serialization and deserialization
/// </summary>
private static Models.SoftwareList.SoftwareList Build()
{
var info = new Models.SoftwareList.Info
{
Name = "XXXXXX",
Value = "XXXXXX",
};
var sharedfeat = new Models.SoftwareList.SharedFeat
{
Name = "XXXXXX",
Value = "XXXXXX",
};
var feature = new Models.SoftwareList.Feature
{
Name = "XXXXXX",
Value = "XXXXXX",
};
var rom = new Models.SoftwareList.Rom
{
Name = "XXXXXX",
Size = "XXXXXX",
Length = "XXXXXX",
CRC = "XXXXXX",
SHA1 = "XXXXXX",
Offset = "XXXXXX",
Value = "XXXXXX",
Status = "XXXXXX",
LoadFlag = "XXXXXX",
};
var dataarea = new Models.SoftwareList.DataArea
{
Name = "XXXXXX",
Size = "XXXXXX",
Width = "XXXXXX",
Endianness = "XXXXXX",
Rom = [rom],
};
var disk = new Models.SoftwareList.Disk
{
Name = "XXXXXX",
MD5 = "XXXXXX",
SHA1 = "XXXXXX",
Status = "XXXXXX",
Writeable = "XXXXXX",
};
var diskarea = new Models.SoftwareList.DiskArea
{
Name = "XXXXXX",
Disk = [disk],
};
var dipvalue = new Models.SoftwareList.DipValue
{
Name = "XXXXXX",
Value = "XXXXXX",
Default = "XXXXXX",
};
var dipswitch = new Models.SoftwareList.DipSwitch
{
Name = "XXXXXX",
Tag = "XXXXXX",
Mask = "XXXXXX",
DipValue = [dipvalue],
};
var part = new Models.SoftwareList.Part
{
Name = "XXXXXX",
Interface = "XXXXXX",
Feature = [feature],
DataArea = [dataarea],
DiskArea = [diskarea],
DipSwitch = [dipswitch],
};
var software = new Models.SoftwareList.Software
{
Name = "XXXXXX",
CloneOf = "XXXXXX",
Supported = "XXXXXX",
Description = "XXXXXX",
Year = "XXXXXX",
Publisher = "XXXXXX",
Notes = "XXXXXX",
Info = [info],
SharedFeat = [sharedfeat],
Part = [part],
};
return new Models.SoftwareList.SoftwareList
{
Name = "XXXXXX",
Description = "XXXXXX",
Notes = "XXXXXX",
Software = [software],
};
}
/// <summary>
/// Validate a Software
/// </summary>
private static void Validate(Models.SoftwareList.Software? software)
{
Assert.NotNull(software);
Assert.Equal("XXXXXX", software.Name);
Assert.Equal("XXXXXX", software.CloneOf);
Assert.Equal("XXXXXX", software.Supported);
Assert.Equal("XXXXXX", software.Description);
Assert.Equal("XXXXXX", software.Year);
Assert.Equal("XXXXXX", software.Publisher);
Assert.Equal("XXXXXX", software.Notes);
Assert.NotNull(software.Info);
var info = Assert.Single(software.Info);
Validate(info);
Assert.NotNull(software.SharedFeat);
var sharedfeat = Assert.Single(software.SharedFeat);
Validate(sharedfeat);
Assert.NotNull(software.Part);
var part = Assert.Single(software.Part);
Validate(part);
}
/// <summary>
/// Validate a Info
/// </summary>
private static void Validate(Models.SoftwareList.Info? info)
{
Assert.NotNull(info);
Assert.Equal("XXXXXX", info.Name);
Assert.Equal("XXXXXX", info.Value);
}
/// <summary>
/// Validate a SharedFeat
/// </summary>
private static void Validate(Models.SoftwareList.SharedFeat? sharedfeat)
{
Assert.NotNull(sharedfeat);
Assert.Equal("XXXXXX", sharedfeat.Name);
Assert.Equal("XXXXXX", sharedfeat.Value);
}
/// <summary>
/// Validate a Part
/// </summary>
private static void Validate(Models.SoftwareList.Part? part)
{
Assert.NotNull(part);
Assert.Equal("XXXXXX", part.Name);
Assert.Equal("XXXXXX", part.Interface);
Assert.NotNull(part.Feature);
var feature = Assert.Single(part.Feature);
Validate(feature);
Assert.NotNull(part.DataArea);
var dataarea = Assert.Single(part.DataArea);
Validate(dataarea);
Assert.NotNull(part.DiskArea);
var diskarea = Assert.Single(part.DiskArea);
Validate(diskarea);
Assert.NotNull(part.DipSwitch);
var dipswitch = Assert.Single(part.DipSwitch);
Validate(dipswitch);
}
/// <summary>
/// Validate a Feature
/// </summary>
private static void Validate(Models.SoftwareList.Feature? feature)
{
Assert.NotNull(feature);
Assert.Equal("XXXXXX", feature.Name);
Assert.Equal("XXXXXX", feature.Value);
}
/// <summary>
/// Validate a DataArea
/// </summary>
private static void Validate(Models.SoftwareList.DataArea? dataarea)
{
Assert.NotNull(dataarea);
Assert.Equal("XXXXXX", dataarea.Name);
Assert.Equal("XXXXXX", dataarea.Size);
Assert.Equal("XXXXXX", dataarea.Width);
Assert.Equal("XXXXXX", dataarea.Endianness);
Assert.NotNull(dataarea.Rom);
var rom = Assert.Single(dataarea.Rom);
Validate(rom);
}
/// <summary>
/// Validate a Rom
/// </summary>
private static void Validate(Models.SoftwareList.Rom? rom)
{
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Size);
Assert.Equal("XXXXXX", rom.Length);
Assert.Equal("XXXXXX", rom.CRC);
Assert.Equal("XXXXXX", rom.SHA1);
Assert.Equal("XXXXXX", rom.Offset);
Assert.Equal("XXXXXX", rom.Value);
Assert.Equal("XXXXXX", rom.Status);
Assert.Equal("XXXXXX", rom.LoadFlag);
}
/// <summary>
/// Validate a DiskArea
/// </summary>
private static void Validate(Models.SoftwareList.DiskArea? diskarea)
{
Assert.NotNull(diskarea);
Assert.Equal("XXXXXX", diskarea.Name);
Assert.NotNull(diskarea.Disk);
var disk = Assert.Single(diskarea.Disk);
Validate(disk);
}
/// <summary>
/// Validate a Disk
/// </summary>
private static void Validate(Models.SoftwareList.Disk? disk)
{
Assert.NotNull(disk);
Assert.Equal("XXXXXX", disk.Name);
Assert.Equal("XXXXXX", disk.MD5);
Assert.Equal("XXXXXX", disk.SHA1);
Assert.Equal("XXXXXX", disk.Status);
Assert.Equal("XXXXXX", disk.Writeable);
}
/// <summary>
/// Validate a DipSwitch
/// </summary>
private static void Validate(Models.SoftwareList.DipSwitch? dipswitch)
{
Assert.NotNull(dipswitch);
Assert.Equal("XXXXXX", dipswitch.Name);
Assert.Equal("XXXXXX", dipswitch.Tag);
Assert.Equal("XXXXXX", dipswitch.Mask);
Assert.NotNull(dipswitch.DipValue);
var dipvalue = Assert.Single(dipswitch.DipValue);
Validate(dipvalue);
}
/// <summary>
/// Validate a DipValue
/// </summary>
private static void Validate(Models.SoftwareList.DipValue? dipvalue)
{
Assert.NotNull(dipvalue);
Assert.Equal("XXXXXX", dipvalue.Name);
Assert.Equal("XXXXXX", dipvalue.Value);
Assert.Equal("XXXXXX", dipvalue.Default);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class VBSPTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new VBSP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new VBSP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new VBSP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new VBSP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new VBSP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new VBSP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class VPKTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new VPK();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new VPK();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new VPK();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new VPK();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new VPK();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new VPK();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class WAD3Tests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new WAD3();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new WAD3();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new WAD3();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new WAD3();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new WAD3();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new WAD3();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,39 @@
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class XMIDTests
{
[Fact]
public void NullString_Null()
{
string? data = null;
var deserializer = new XMID();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyString_Null()
{
string? data = string.Empty;
var deserializer = new XMID();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidString_Null()
{
string? data = "INVALID";
var deserializer = new XMID();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,73 @@
using System.IO;
using System.Linq;
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class XZPTests
{
[Fact]
public void NullArray_Null()
{
byte[]? data = null;
int offset = 0;
var deserializer = new XZP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void EmptyArray_Null()
{
byte[]? data = [];
int offset = 0;
var deserializer = new XZP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void InvalidArray_Null()
{
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
int offset = 0;
var deserializer = new XZP();
var actual = deserializer.Deserialize(data, offset);
Assert.Null(actual);
}
[Fact]
public void NullStream_Null()
{
Stream? data = null;
var deserializer = new XZP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyStream_Null()
{
Stream? data = new MemoryStream([]);
var deserializer = new XZP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidStream_Null()
{
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
var deserializer = new XZP();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,38 @@
using SabreTools.Serialization.Deserializers;
using Xunit;
namespace SabreTools.Serialization.Test.Deserializers
{
public class XeMIDTests
{
[Fact]
public void NullString_Null()
{
string? data = null;
var deserializer = new XeMID();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void EmptyString_Null()
{
string? data = string.Empty;
var deserializer = new XeMID();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
[Fact]
public void InvalidString_Null()
{
string? data = "INVALID";
var deserializer = new XeMID();
var actual = deserializer.Deserialize(data);
Assert.Null(actual);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,91 +0,0 @@
using System;
using System.IO;
using System.Security.Cryptography;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test
{
public class MetadataSerializationTests
{
[Fact]
public void OpenMSXSeserializeTest()
{
// Create the object for serialization
var dat = GenerateOpenMSX();
// Deserialize the file
var stream = OpenMSX.SerializeStream(dat) as MemoryStream;
// Validate the values
Assert.NotNull(stream);
byte[] hash = SHA1.HashData(stream.GetBuffer());
string hashstr = BitConverter.ToString(hash).Replace("-", string.Empty);
Assert.Equal("CCBFAAB56BAAF6BE56A85918055784A615379659", hashstr);
}
#region Payload Generators
/// <summary>
/// Generate a consistent OpenMSX SoftwareDb for testing
/// </summary>
private static Models.OpenMSX.SoftwareDb GenerateOpenMSX()
{
var original = new Models.OpenMSX.Original
{
Value = "false",
Content = "Original Name",
};
var rom = new Models.OpenMSX.Rom
{
Start = "0x0000",
Type = "Game",
Hash = "da39a3ee5e6b4b0d3255bfef95601890afd80709",
Remark = "Comment",
};
var megaRom = new Models.OpenMSX.MegaRom
{
Start = "0x1000",
Type = "Software",
Hash = "da39a3ee5e6b4b0d3255bfef95601890afd80709",
Remark = "Comment",
};
var sccPlusCart = new Models.OpenMSX.SCCPlusCart
{
Start = "0x2000",
Type = "Utility",
Hash = "da39a3ee5e6b4b0d3255bfef95601890afd80709",
Remark = "Comment",
};
var dump = new Models.OpenMSX.Dump[]
{
new Models.OpenMSX.Dump { Original = original, Rom = rom },
new Models.OpenMSX.Dump { Rom = megaRom },
new Models.OpenMSX.Dump { Rom = sccPlusCart },
};
var software = new Models.OpenMSX.Software
{
Title = "Software Title",
GenMSXID = "00000", // Not required
System = "MSX 2",
Company = "Imaginary Company, Inc.",
Year = "19xx",
Country = "Imaginaria",
Dump = dump,
};
return new Models.OpenMSX.SoftwareDb
{
Timestamp = "1234567890",
Software = [software],
};
}
#endregion
}
}

View File

@@ -1,38 +1,39 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
<IsPackable>false</IsPackable>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<TargetFrameworks>net6.0;net8.0;net9.0</TargetFrameworks>
<IsPackable>false</IsPackable>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\SabreTools.Serialization\SabreTools.Serialization.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SabreTools.Serialization\SabreTools.Serialization.csproj" />
</ItemGroup>
<ItemGroup>
<None Remove="TestData\*" />
</ItemGroup>
<ItemGroup>
<None Remove="TestData\*" />
</ItemGroup>
<ItemGroup>
<Content Include="TestData\*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<Content Include="TestData\*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="SabreTools.Models" Version="1.4.11" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="SabreTools.Hashing" Version="1.4.0" />
<PackageReference Include="SabreTools.Models" Version="1.5.5" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>
</Project>

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class ArchiveDotOrgTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new ArchiveDotOrg();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new ArchiveDotOrg();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class AttractModeTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new AttractMode();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new AttractMode();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class CatalogTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new Catalog();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new Catalog();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class ClrMameProTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new ClrMamePro();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new ClrMamePro();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class CueSheetTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new CueSheet();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new CueSheet();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class DosCenterTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new DosCenter();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new DosCenter();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class EverdriveSMDBTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new EverdriveSMDB();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new EverdriveSMDB();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class HashfileTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new Hashfile();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new Hashfile();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class IRDTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new IRD();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new IRD();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class ListromTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new Listrom();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new Listrom();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class ListxmlTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new Listxml();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new Listxml();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class LogiqxTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new Logiqx();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new Logiqx();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class M1Tests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new M1();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new M1();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class OfflineListTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new OfflineList();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new OfflineList();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class OpenMSXTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new OpenMSX();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new OpenMSX();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class RomCenterTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new RomCenter();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new RomCenter();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class SeparatedValueTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new SeparatedValue();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new SeparatedValue();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.IO;
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class SoftwareListTests
{
[Fact]
public void SerializeArray_Null_Null()
{
var serializer = new SoftwareList();
byte[]? actual = serializer.SerializeArray(null);
Assert.Null(actual);
}
[Fact]
public void SerializeStream_Null_Null()
{
var serializer = new SoftwareList();
Stream? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,16 @@
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class XMIDTests
{
[Fact]
public void SerializeString_Null_Null()
{
var serializer = new XMID();
string? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -0,0 +1,16 @@
using SabreTools.Serialization.Serializers;
using Xunit;
namespace SabreTools.Serialization.Test.Serializers
{
public class XeMIDTests
{
[Fact]
public void SerializeString_Null_Null()
{
var serializer = new XeMID();
string? actual = serializer.Serialize(null);
Assert.Null(actual);
}
}
}

View File

@@ -1,228 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Source: https://ia902607.us.archive.org/4/items/adventuresofsher00doylrich/adventuresofsher00doylrich_files.xml
-->
<files>
<file name="__ia_thumb.jpg" source="original">
<mtime>1657820174</mtime>
<size>23393</size>
<md5>33ca910055358d18e116ea66a0abdf04</md5>
<crc32>aad0f2dc</crc32>
<sha1>fc6d673ef7fbe974bba88b8275c737eeb20b5ba8</sha1>
<format>Item Tile</format>
<rotation>0</rotation>
</file>
<file name="_cloth_detection.log" source="derivative">
<cloth_cover_detection_module_version>1.2</cloth_cover_detection_module_version>
<format>Cloth Cover Detection Log</format>
<original>scandata.zip</original>
<mtime>1682523106</mtime>
<size>717</size>
<md5>3ed8a80448263ebfad242b8fa5a1a18d</md5>
<crc32>d886dce1</crc32>
<sha1>4f8d103cf07c29e1d3bb8273870f1daca4a89f26</sha1>
</file>
<file name="adventuresofsher00doylrich.djvu" source="derivative">
<format>DjVu</format>
<original>adventuresofsher00doylrich_djvu.xml</original>
<mtime>1288609616</mtime>
<size>11176526</size>
<md5>52ccad905110bc7f3c0fe032ef744fa1</md5>
<crc32>91973508</crc32>
<sha1>aa5214400b60e3b68f5eaa9733e10af4bcfe4e8d</sha1>
</file>
<file name="adventuresofsher00doylrich.gif" source="derivative">
<format>Animated GIF</format>
<original>adventuresofsher00doylrich_jp2.zip</original>
<mtime>1288593173</mtime>
<size>334379</size>
<md5>4d56403c12771ed7e396f6187d95502d</md5>
<crc32>1a8585c1</crc32>
<sha1>6062155959dd69f279a489b3761afa0a1638173d</sha1>
</file>
<file name="adventuresofsher00doylrich.pdf" source="derivative">
<pdf_module_version>0.0.22</pdf_module_version>
<format>Text PDF</format>
<original>adventuresofsher00doylrich_page_numbers.json</original>
<mtime>1682525473</mtime>
<size>26126569</size>
<md5>98ad55b9989671f823228055bfbca465</md5>
<crc32>cdc5f40d</crc32>
<sha1>e358dd22e04f7efcd4dfc8a6c2d714a0e0a8297c</sha1>
</file>
<file name="adventuresofsher00doylrich_archive.torrent" source="metadata">
<btih>4b5bbf39f9e489f66e0c70a9ac45af495b31a2ba</btih>
<mtime>1688944719</mtime>
<size>17197</size>
<md5>91aa4822d1552ef8bd08b27b14d8af4d</md5>
<crc32>10a3d397</crc32>
<sha1>9f5d4b652ac6903e218c8ff8e854482ab3d31b99</sha1>
<format>Archive BitTorrent</format>
</file>
<file name="adventuresofsher00doylrich_chocr.html.gz" source="derivative">
<ocr>tesseract 5.3.0-3-g9920</ocr>
<ocr_parameters>lang-eng;two-pass-disabled;pass-dpi-disabled;autonomous-mode-disabled;binarisation-method-otsu</ocr_parameters>
<ocr_module_version>0.0.21</ocr_module_version>
<ocr_detected_script>Latin</ocr_detected_script>
<ocr_detected_script_conf>0.8867</ocr_detected_script_conf>
<ocr_detected_lang>en</ocr_detected_lang>
<ocr_detected_lang_conf>1.0000</ocr_detected_lang_conf>
<format>chOCR</format>
<original>adventuresofsher00doylrich_jp2.zip</original>
<mtime>1682523054</mtime>
<size>8326755</size>
<md5>cda085dadcc74ca4bbeb768b69e7b28b</md5>
<crc32>faa3bbc1</crc32>
<sha1>0ceffd2d58757e30ccfcc84ff6805093e32607b3</sha1>
</file>
<file name="adventuresofsher00doylrich_dc.xml" source="original">
<format>Dublin Core</format>
<mtime>1682518166</mtime>
<size>1712</size>
<md5>bb3294746c4d5bb8102f8426454b26fb</md5>
<crc32>7c20c9c9</crc32>
<sha1>2bc134939b5f044396c56af740ad55029978859e</sha1>
</file>
<file name="adventuresofsher00doylrich_djvu.txt" source="derivative">
<format>DjVuTXT</format>
<original>adventuresofsher00doylrich_djvu.xml</original>
<mtime>1682523254</mtime>
<size>613882</size>
<md5>022b57b4017bbd8e6564c6e0968ad063</md5>
<crc32>2828f839</crc32>
<sha1>1535e2f509fc3a81c377d2b7270d21a95af71d65</sha1>
</file>
<file name="adventuresofsher00doylrich_djvu.xml" source="derivative">
<format>Djvu XML</format>
<original>adventuresofsher00doylrich_hocr.html</original>
<mtime>1682523185</mtime>
<size>8593952</size>
<md5>6faee3cd4ba7b3eaca3a2f5f4e8414f6</md5>
<crc32>51713c61</crc32>
<sha1>16dc73c2bdce4705c37d86a798d83fb780929928</sha1>
</file>
<file name="adventuresofsher00doylrich_files.xml" source="original">
<format>Metadata</format>
<md5>f39ff302a7965a1a077f3c4962f5d2e9</md5>
<summation>md5</summation>
</file>
<file name="adventuresofsher00doylrich_hocr.html" source="derivative">
<hocr_char_to_word_module_version>1.1.0</hocr_char_to_word_module_version>
<hocr_char_to_word_hocr_version>1.1.15</hocr_char_to_word_hocr_version>
<ocr_parameters>lang-eng;two-pass-disabled;pass-dpi-disabled;autonomous-mode-disabled;binarisation-method-otsu</ocr_parameters>
<ocr_module_version>0.0.21</ocr_module_version>
<ocr_detected_script>Latin</ocr_detected_script>
<ocr_detected_script_conf>0.8867</ocr_detected_script_conf>
<ocr_detected_lang>en</ocr_detected_lang>
<ocr_detected_lang_conf>1.0000</ocr_detected_lang_conf>
<format>hOCR</format>
<original>adventuresofsher00doylrich_chocr.html.gz</original>
<mtime>1682523150</mtime>
<size>15785810</size>
<md5>afbb8a9c1e6c25b3755fa6345153b13d</md5>
<crc32>e79c31fd</crc32>
<sha1>8b7cd7fd2010544783277f502c4103310dc2e2c4</sha1>
</file>
<file name="adventuresofsher00doylrich_hocr_pageindex.json.gz" source="derivative">
<hocr_pageindex_module_version>1.0.0</hocr_pageindex_module_version>
<hocr_pageindex_hocr_version>1.1.15</hocr_pageindex_hocr_version>
<format>OCR Page Index</format>
<original>adventuresofsher00doylrich_hocr.html</original>
<mtime>1682523219</mtime>
<size>4232</size>
<md5>aec425c66ef34149cff679b8998c2a36</md5>
<crc32>9a6e2f76</crc32>
<sha1>cc91c1eb055652ab6c9de878c6b54e8b95bddad1</sha1>
</file>
<file name="adventuresofsher00doylrich_hocr_searchtext.txt.gz" source="derivative">
<hocr_fts_text_module_version>1.1.0</hocr_fts_text_module_version>
<hocr_fts_text_hocr_version>1.1.15</hocr_fts_text_hocr_version>
<word_conf_0_10>531</word_conf_0_10>
<word_conf_11_20>242</word_conf_11_20>
<word_conf_21_30>298</word_conf_21_30>
<word_conf_31_40>321</word_conf_31_40>
<word_conf_41_50>389</word_conf_41_50>
<word_conf_51_60>450</word_conf_51_60>
<word_conf_61_70>671</word_conf_61_70>
<word_conf_71_80>1059</word_conf_71_80>
<word_conf_81_90>3102</word_conf_81_90>
<word_conf_91_100>103350</word_conf_91_100>
<format>OCR Search Text</format>
<original>adventuresofsher00doylrich_hocr.html</original>
<mtime>1682523242</mtime>
<size>224594</size>
<md5>2e1011def53909a247f73af66420e0c3</md5>
<crc32>32dddf59</crc32>
<sha1>f303467ce8f109a1d9cf49f2038c9a1d43e3c63e</sha1>
</file>
<file name="adventuresofsher00doylrich_jp2.zip" source="derivative">
<format>Single Page Processed JP2 ZIP</format>
<original>adventuresofsher00doylrich_raw_jp2.zip</original>
<mtime>1288593129</mtime>
<size>203319748</size>
<md5>2acbe6b61d35d8bd093127f0cef724c9</md5>
<crc32>66bcf599</crc32>
<sha1>a8801760eec5442176281584bd6242868f81cde5</sha1>
<filecount>364</filecount>
</file>
<file name="adventuresofsher00doylrich_marc.xml" source="original">
<format>MARC</format>
<md5>e951175fb1ee03c706ab6ee34754a92c</md5>
<mtime>1682518056</mtime>
<size>7679</size>
<crc32>3538b620</crc32>
<sha1>8fd493fa0971c2f7c2fdb1d84e0ec4234b878ff4</sha1>
</file>
<file name="adventuresofsher00doylrich_meta.xml" source="original">
<format>Metadata</format>
<mtime>1682525557</mtime>
<size>3790</size>
<md5>e98cb44acdb4e4f070fddb8b1f328d93</md5>
<crc32>04ee4346</crc32>
<sha1>c687fc00d20b516b0cf19225296e984cbfe7c315</sha1>
</file>
<file name="adventuresofsher00doylrich_metasource.xml" source="original">
<format>MARC Source</format>
<md5>7099c2013db04ef8a7277386ce74de54</md5>
<mtime>1682518056</mtime>
<size>527</size>
<crc32>6fa5d977</crc32>
<sha1>34ed3e366ed809a1a39a265373b9cf5b8cc06f0c</sha1>
</file>
<file name="adventuresofsher00doylrich_page_numbers.json" source="derivative">
<format>Page Numbers JSON</format>
<original>adventuresofsher00doylrich_djvu.xml</original>
<mtime>1682523259</mtime>
<size>67337</size>
<md5>f9179733924fa4566f0e9a05c8c276dd</md5>
<crc32>2bd8369f</crc32>
<sha1>e4104152caa990c72f986eb63c660239f0111feb</sha1>
</file>
<file name="adventuresofsher00doylrich_raw_jp2.zip" source="original">
<format>Single Page Raw JP2 ZIP</format>
<md5>d2a1137d4f8fed61be945f878444923b</md5>
<mtime>1204986411</mtime>
<size>370667543</size>
<crc32>12eda51c</crc32>
<sha1>402b01b5a734ae4f857991c0977ba629a8606932</sha1>
<filecount>364</filecount>
</file>
<file name="adventuresofsher00doylrich_reviews.xml" source="original">
<mtime>1688944715</mtime>
<size>9412</size>
<md5>ff0c9653a7aa865ea01e032e8b657736</md5>
<crc32>7634dbbc</crc32>
<sha1>f93a8206d6836f08c19dd023eb552bed2106cad9</sha1>
<format>Metadata</format>
</file>
<file name="scandata.zip" source="original">
<format>Scribe Scandata ZIP</format>
<md5>506fdf9aa054fbc7e9e2577d05d5e7cf</md5>
<mtime>1682523105</mtime>
<size>55175976</size>
<crc32>232ce248</crc32>
<sha1>9adf53bc1b8e7be5afe3526d2ab64f9696058488</sha1>
<filecount>11</filecount>
</file>
</files>

Some files were not shown because too many files have changed in this diff Show More