using System;
using System.IO;
using System.Text;
using Newtonsoft.Json;
if (args.Length < 1) {
Console.WriteLine("No Mode Provided! Quitting.");
Environment.Exit(2);
}
if (args[0] == "generate") {
GenerateTestBin();
Environment.Exit(0);
} else if (args[0] == "verify") {
bool verifyf16 = args.Length >= 2 && args[1] == "f16";
int result = VerifyTestBin(verifyf16);
if (result == 1) {
Console.WriteLine("Invalid Binary!");
}
Environment.Exit(result);
} else {
Environment.Exit(2);
}
bool ArrayAssertEq<T>(T[] a, T[] b) where T: IEquatable<T> {
if (a == null || b == null) {
return a == b; }
if (a.Length != b.Length) {
return false;
}
return a.Zip(b, Tuple.Create).Select(pair => AssertEq(pair.Item1, pair.Item2)).All(item => item);
}
bool AssertEq<T>(T a, T b) where T: IEquatable<T> {
if (a == null) {
return false;
}
if (a.Equals(b)) return true;
Console.WriteLine($"Assertion Failed on type {typeof(T).FullName}! Expected {JsonConvert.SerializeObject(b)} but got {JsonConvert.SerializeObject(a)}!");
return false;
}
int VerifyTestBin(bool verifyf16) {
using (var stream = File.Open("input.bin", FileMode.Open)) {
using (var reader = new BinaryReader(stream, Encoding.UTF8, false)) {
if(!AssertEq(reader.ReadBoolean(), true)) return 1;
if(!AssertEq(reader.ReadBoolean(), false)) return 1;
if(!AssertEq(reader.ReadByte(), 0x45)) return 1;
if(!ArrayAssertEq (reader.ReadBytes(5), new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05 })) return 1;
if(!AssertEq(reader.ReadChar(), '\u2603')) return 1;
if(!AssertEq(reader.ReadDouble(), 727.247d)) return 1;
Half h = reader.ReadHalf();
if (verifyf16) {
if(!AssertEq(h, (Half)247)) return 1;
}
if(!AssertEq(reader.ReadInt16(), (short)-5)) return 1;
if(!AssertEq(reader.ReadInt32(), (int)-100)) return 1;
if(!AssertEq(reader.ReadInt64(), (long) -2147483649)) return 1;
if(!AssertEq (reader.ReadSByte(), (sbyte)-112)) return 1;
if(!AssertEq(reader.ReadSingle(), 5.2f)) return 1;
if(!AssertEq(reader.Read7BitEncodedInt(), -723)) return 1;
if(!AssertEq(reader.Read7BitEncodedInt(), 404)) return 1;
if(!AssertEq(reader.Read7BitEncodedInt64(), 9000000000000000000)) return 1;
if(!AssertEq(reader.Read7BitEncodedInt64(), -500000000000000000)) return 1;
if(!AssertEq(reader.ReadString(), "meowmeowmeowmeowmeow")) return 1;
if(!AssertEq(reader.ReadUInt16(), (ushort)624)) return 1;
if(!AssertEq(reader.ReadUInt32(), (uint)3000000000)) return 1;
if(!AssertEq(reader.ReadUInt64(), (ulong)42307830165)) return 1;
if(!AssertEq(reader.ReadChar(), '\u0000')) return 1;
return 0;
}
}
}
void GenerateTestBin() {
using (var stream = File.Open("output.bin", FileMode.Create)) {
using (var writer = new BinaryWriter(stream, Encoding.UTF8, false)) {
writer.Write(true);
writer.Write(false);
writer.Write((byte)0x45);
var bytes = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05 };
writer.Write(bytes);
writer.Write('\u2603');
writer.Write(727.247d);
writer.Write((Half)247);
writer.Write((short)(-5));
writer.Write((int)-100);
writer.Write((long)-2147483649);
writer.Write((sbyte)-112);
writer.Write(5.2f);
writer.Write7BitEncodedInt(-723);
writer.Write7BitEncodedInt(404);
writer.Write7BitEncodedInt64(9000000000000000000);
writer.Write7BitEncodedInt64(-500000000000000000);
writer.Write("meowmeowmeowmeowmeow");
writer.Write((ushort)624);
writer.Write((uint)3000000000);
writer.Write((ulong)42307830165);
writer.Write('\u0000');
}
}
}