// Copyright Epic Games, Inc. All Rights Reserved. using System.Collections.Generic; using System.IO; using System.Linq; using EpicGames.Core; using EpicGames.Serialization; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Jupiter.Tests.Unit { [TestClass] public class CompactBinaryTests { [TestMethod] public void BuildObject() { byte[] bytes = File.ReadAllBytes("CompactBinaryObjects/build"); CbObject o = new CbObject(bytes); Assert.AreEqual(new Utf8String("BuildAction"), o.AsField().Name); List buildActionFields = o.ToList(); Assert.AreEqual(3, buildActionFields.Count); Assert.AreEqual(new Utf8String("Function"), buildActionFields[0].Name); Assert.AreEqual(new Utf8String("Constants"), buildActionFields[1].Name); Assert.AreEqual(new Utf8String("Inputs"), buildActionFields[2].Name); List constantsFields = buildActionFields[1].ToList(); Assert.AreEqual(3, constantsFields.Count); Assert.AreEqual(new Utf8String("TextureBuildSettings"), constantsFields[0].Name); Assert.AreEqual(new Utf8String("TextureOutputSettings"), constantsFields[1].Name); Assert.AreEqual(new Utf8String("TextureSource"), constantsFields[2].Name); List inputsFields = buildActionFields[2].ToList(); Assert.AreEqual(1, inputsFields.Count); Assert.AreEqual(new Utf8String("7587B323422942733DDD048A91709FDE"), inputsFields[0].Name); Assert.IsTrue(inputsFields[0].IsBinaryAttachment()); Assert.IsTrue(inputsFields[0].IsAttachment()); Assert.IsFalse(inputsFields[0].IsObjectAttachment()); Assert.AreEqual(IoHash.Parse("f855382171a0b1e5a1c653aa6c5121a05cbf4ba0"), inputsFields[0].AsHash()); } [TestMethod] public void ReferenceOutput() { byte[] bytes = File.ReadAllBytes("CompactBinaryObjects/ReferenceOutput"); CbObject o = new CbObject(bytes); Assert.AreEqual(new Utf8String("BuildOutput"), o.AsField().Name); List buildActionFields = o.ToList(); Assert.AreEqual(1, buildActionFields.Count); CbField payloads = buildActionFields[0]; List payloadFields = payloads.ToList(); Assert.AreEqual(3, payloadFields.Count); Assert.AreEqual(IoHash.Parse("5d8a6dc277c968f0d027c98f879c955c1905c293"), payloadFields[0]["RawHash"]!.AsHash()); Assert.AreEqual(IoHash.Parse("313f0d0d334100d83aeb1ee2c42794fd087cb0ae"), payloadFields[1]["RawHash"]!.AsHash()); Assert.AreEqual(IoHash.Parse("c7a03f83c08cdca882110ecf2b5654ee3b09b11e"), payloadFields[2]["RawHash"]!.AsHash()); } [TestMethod] public void CompactBinary() { byte[] bytes = File.ReadAllBytes("CompactBinaryObjects/compact_binary"); CbObject o = new CbObject(bytes); Assert.AreEqual(new Utf8String(""), o.AsField().Name); List buildActionFields = o.ToList(); Assert.AreEqual(3, buildActionFields.Count); CbField payloads = buildActionFields[0]; List payloadFields = payloads.ToList(); Assert.AreEqual(2, payloadFields.Count); Assert.AreEqual("{\"Key\":{\"Bucket\":\"EditorDomainPackage\",\"Hash\":\"37dbaa409ef30ba67f18c8fc2faaf606636cb915\"},\"Meta\":{\"FileSize\":24789},\"Attachments\":[{\"Id\":\"000000000000000000000001\",\"RawHash\":\"da6fc57e4b9f91377c9509ea0ad567bacb3796c5\",\"RawSize\":24789}]}", o.ToJson()); } [TestMethod] public void WriteArray() { IoHash hash1 = IoHash.Parse("5d8a6dc277c968f0d027c98f879c955c1905c293"); IoHash hash2 = IoHash.Parse("313f0d0d334100d83aeb1ee2c42794fd087cb0ae"); CbWriter writer = new CbWriter(); writer.BeginObject(); writer.BeginUniformArray("needs", CbFieldType.Hash); writer.WriteHashValue(hash1); writer.WriteHashValue(hash2); writer.EndUniformArray(); writer.EndObject(); byte[] objectData = writer.ToByteArray(); CbObject o = new CbObject(objectData); // the top object has no name Assert.AreEqual(new Utf8String(""), o.AsField().Name); List fields = o.ToList(); Assert.AreEqual(1, fields.Count); CbField? needs = o["needs"]; List blobList = needs!.AsArray().ToList(); IoHash[] blobs = blobList.Select(field => field!.AsHash()).ToArray(); CollectionAssert.AreEqual(new IoHash[] { hash1, hash2 }, blobs); } [TestMethod] public void WriteObject() { IoHash hash1 = IoHash.Parse("5d8a6dc277c968f0d027c98f879c955c1905c293"); CbWriter writer = new CbWriter(); writer.BeginObject(); writer.WriteString("string", "test"); writer.WriteBinaryAttachment("hash", hash1); writer.EndObject(); byte[] objectData = writer.ToByteArray(); CbObject o = new CbObject(objectData); // the object has no name and 2 fields Assert.AreEqual(new Utf8String(""), o.AsField().Name); List fields = o.ToList(); Assert.AreEqual(2, fields.Count); CbField? stringField = o["string"]; Assert.AreEqual("test", stringField!.AsString()); CbField? hashField = o["hash"]; Assert.AreEqual(hash1, hashField!.AsAttachment()); } } }