public static void WriteElement(this DimensionCodec value, NbtWriter writer) { writer.WriteBool("piglin_safe", value.Element.PiglinSafe); writer.WriteBool("natural", value.Element.Natural); writer.WriteFloat("ambient_light", value.Element.AmbientLight); if (value.Element.FixedTime.HasValue) { writer.WriteLong("fixed_time", value.Element.FixedTime.Value); } writer.WriteString("infiniburn", value.Element.Infiniburn); writer.WriteBool("respawn_anchor_works", value.Element.RespawnAnchorWorks); writer.WriteBool("has_skylight", value.Element.HasSkylight); writer.WriteBool("bed_works", value.Element.BedWorks); writer.WriteString("effects", value.Element.Effects); writer.WriteBool("has_raids", value.Element.HasRaids); writer.WriteInt("min_y", value.Element.MinY); writer.WriteInt("height", value.Element.Height); writer.WriteInt("logical_height", value.Element.LogicalHeight); writer.WriteFloat("coordinate_scale", value.Element.CoordinateScale); writer.WriteBool("ultrawarm", value.Element.Ultrawarm); writer.WriteBool("has_ceiling", value.Element.HasCeiling); }
public async Task WriteSlotAsync(ItemStack slot) { await this.WriteBooleanAsync(slot.Present); if (slot.Present) { await this.WriteVarIntAsync(slot.Id); await this.WriteByteAsync((sbyte)slot.Count); var writer = new NbtWriter(this, ""); if (slot.Nbt == null) { writer.EndCompound(); writer.Finish(); return; } //TODO write enchants writer.WriteShort("id", (short)slot.Id); writer.WriteInt("Damage", slot.Nbt.Damage); writer.WriteByte("Count", (byte)slot.Count); writer.EndCompound(); writer.Finish(); } }
public void ValueTest() { // write one named tag for every value type, and read it back using (var ms = new MemoryStream()) { var writer = new NbtWriter(ms, "root"); Assert.AreEqual(ms, writer.BaseStream); { writer.WriteByte("byte", 1); writer.WriteShort("short", 2); writer.WriteInt("int", 3); writer.WriteLong("long", 4L); writer.WriteFloat("float", 5f); writer.WriteDouble("double", 6d); writer.WriteByteArray("byteArray", new byte[] { 10, 11, 12 }); writer.WriteIntArray("intArray", new[] { 20, 21, 22 }); writer.WriteString("string", "123"); } Assert.IsFalse(writer.IsDone); writer.EndCompound(); Assert.IsTrue(writer.IsDone); writer.Finish(); ms.Position = 0; var file = new NbtFile(); file.LoadFromStream(ms, NbtCompression.None); TestFiles.AssertValueTest(file); } }
public async Task WriteSlotAsync(ItemStack slot) { if (slot is null) { slot = new ItemStack(0, 0) { Present = true } } ; var item = slot.GetItem(); await this.WriteBooleanAsync(slot.Present); if (slot.Present) { await this.WriteVarIntAsync(item.Id); await this.WriteByteAsync((sbyte)slot.Count); var writer = new NbtWriter(this, ""); var itemMeta = slot.ItemMeta; //TODO write enchants if (itemMeta.HasTags()) { writer.WriteByte("Unbreakable", itemMeta.Unbreakable ? 1 : 0); if (itemMeta.Durability > 0) { writer.WriteInt("Damage", itemMeta.Durability); } if (itemMeta.CustomModelData > 0) { writer.WriteInt("CustomModelData", itemMeta.CustomModelData); } if (itemMeta.CanDestroy != null) { writer.BeginList("CanDestroy", NbtTagType.String, itemMeta.CanDestroy.Count); foreach (var block in itemMeta.CanDestroy) { writer.WriteString(block); } writer.EndList(); } if (itemMeta.Name != null) { writer.BeginCompound("display"); writer.WriteString("Name", JsonConvert.SerializeObject(new List <ChatMessage> { (ChatMessage)itemMeta.Name })); if (itemMeta.Lore != null) { writer.BeginList("Lore", NbtTagType.String, itemMeta.Lore.Count); foreach (var lore in itemMeta.Lore) { writer.WriteString(JsonConvert.SerializeObject(new List <ChatMessage> { (ChatMessage)lore })); } writer.EndList(); } writer.EndCompound(); } else if (itemMeta.Lore != null) { writer.BeginCompound("display"); writer.BeginList("Lore", NbtTagType.String, itemMeta.Lore.Count); foreach (var lore in itemMeta.Lore) { writer.WriteString(JsonConvert.SerializeObject(new List <ChatMessage> { (ChatMessage)lore })); } writer.EndList(); writer.EndCompound(); } } writer.WriteString("id", item.UnlocalizedName); writer.WriteByte("Count", (byte)slot.Count); writer.EndCompound(); writer.Finish(); } }
public void CompoundListTest() { // test writing various combinations of compound tags and list tags const string testString = "Come on and slam, and welcome to the jam."; using (var ms = new MemoryStream()) { var writer = new NbtWriter(ms, "Test"); { writer.BeginCompound("EmptyCompy"); {} writer.EndCompound(); writer.BeginCompound("OuterNestedCompy"); { writer.BeginCompound("InnerNestedCompy"); { writer.WriteInt("IntTest", 123); writer.WriteString("StringTest", testString); } writer.EndCompound(); } writer.EndCompound(); writer.BeginList("ListOfInts", NbtTagType.Int, 3); { writer.WriteInt(1); writer.WriteInt(2); writer.WriteInt(3); } writer.EndList(); writer.BeginCompound("CompoundOfListsOfCompounds"); { writer.BeginList("ListOfCompounds", NbtTagType.Compound, 1); { writer.BeginCompound(); { writer.WriteInt("TestInt", 123); } writer.EndCompound(); } writer.EndList(); } writer.EndCompound(); writer.BeginList("ListOfEmptyLists", NbtTagType.List, 3); { writer.BeginList(NbtTagType.List, 0); {} writer.EndList(); writer.BeginList(NbtTagType.List, 0); {} writer.EndList(); writer.BeginList(NbtTagType.List, 0); {} writer.EndList(); } writer.EndList(); } writer.EndCompound(); writer.Finish(); ms.Seek(0, SeekOrigin.Begin); var file = new NbtFile(); file.LoadFromStream(ms, NbtCompression.None); Console.WriteLine(file.ToString()); } }
public void ValueTest() { // write one named tag for every value type, and read it back using (var ms = new MemoryStream()) { var writer = new NbtWriter(ms, "root"); { writer.WriteByte("byte", 1); writer.WriteShort("short", 2); writer.WriteInt("int", 3); writer.WriteLong("long", 4L); writer.WriteFloat("float", 5f); writer.WriteDouble("double", 6d); writer.WriteByteArray("byteArray", new byte[] { 10, 11, 12 }); writer.WriteIntArray("intArray", new[] { 20, 21, 22 }); writer.WriteString("string", "123"); } writer.EndCompound(); writer.Finish(); ms.Position = 0; var file = new NbtFile(); file.LoadFromStream(ms, NbtCompression.None); TestFiles.AssertValueTest(file); } }
public void ListTest() { // write short (1-element) lists of every possible kind using (var ms = new MemoryStream()) { var writer = new NbtWriter(ms, "Test"); writer.BeginList("LotsOfLists", NbtTagType.List, 11); { writer.BeginList(NbtTagType.Byte, 1); writer.WriteByte(1); writer.EndList(); writer.BeginList(NbtTagType.ByteArray, 1); writer.WriteByteArray(new byte[] { 1 }); writer.EndList(); writer.BeginList(NbtTagType.Compound, 1); writer.BeginCompound(); writer.EndCompound(); writer.EndList(); writer.BeginList(NbtTagType.Double, 1); writer.WriteDouble(1); writer.EndList(); writer.BeginList(NbtTagType.Float, 1); writer.WriteFloat(1); writer.EndList(); writer.BeginList(NbtTagType.Int, 1); writer.WriteInt(1); writer.EndList(); writer.BeginList(NbtTagType.IntArray, 1); writer.WriteIntArray(new[] { 1 }); writer.EndList(); writer.BeginList(NbtTagType.List, 1); writer.BeginList(NbtTagType.List, 0); writer.EndList(); writer.EndList(); writer.BeginList(NbtTagType.Long, 1); writer.WriteLong(1); writer.EndList(); writer.BeginList(NbtTagType.Short, 1); writer.WriteShort(1); writer.EndList(); writer.BeginList(NbtTagType.String, 1); writer.WriteString("ponies"); writer.EndList(); } writer.EndList(); writer.EndCompound(); writer.Finish(); ms.Position = 0; var reader = new NbtReader(ms); Assert.DoesNotThrow(() => reader.ReadAsTag()); } }
public void ErrorTest() { using (var ms = new MemoryStream()) { // null constructor parameters, or a non-writable stream Assert.Throws<ArgumentNullException>(() => new NbtWriter(null, "root")); Assert.Throws<ArgumentNullException>(() => new NbtWriter(ms, null)); Assert.Throws<ArgumentException>(() => new NbtWriter(new NonWritableStream(), "root")); var writer = new NbtWriter(ms, "root"); { // use negative list size Assert.Throws<ArgumentOutOfRangeException>(() => writer.BeginList("list", NbtTagType.Int, -1)); writer.BeginList("listOfLists", NbtTagType.List, 1); Assert.Throws<ArgumentOutOfRangeException>(() => writer.BeginList(NbtTagType.Int, -1)); writer.BeginList(NbtTagType.Int, 0); writer.EndList(); writer.EndList(); writer.BeginList("list", NbtTagType.Int, 1); // invalid list type Assert.Throws<ArgumentOutOfRangeException>(() => writer.BeginList(NbtTagType.End, 0)); // call EndCompound when not in a compound Assert.Throws<NbtFormatException>(writer.EndCompound); // end list before all elements have been written Assert.Throws<NbtFormatException>(writer.EndList); // write the wrong kind of tag inside a list Assert.Throws<NbtFormatException>(() => writer.WriteShort(0)); // write a named tag where an unnamed tag is expected Assert.Throws<NbtFormatException>(() => writer.WriteInt("NamedInt", 0)); // write too many list elements writer.WriteTag(new NbtInt()); Assert.Throws<NbtFormatException>(() => writer.WriteInt(0)); writer.EndList(); // write a null tag Assert.Throws<ArgumentNullException>(() => writer.WriteTag(null)); // write an unnamed tag where a named tag is expected Assert.Throws<NbtFormatException>(() => writer.WriteTag(new NbtInt())); Assert.Throws<NbtFormatException>(() => writer.WriteInt(0)); // end a list when not in a list Assert.Throws<NbtFormatException>(writer.EndList); // write null values where unacceptable Assert.Throws<ArgumentNullException>(() => writer.WriteString("NullString", null)); Assert.Throws<ArgumentNullException>(() => writer.WriteByteArray("NullByteArray", null)); Assert.Throws<ArgumentNullException>(() => writer.WriteIntArray("NullIntArray", null)); Assert.Throws<ArgumentNullException>(() => writer.WriteString(null)); Assert.Throws<ArgumentNullException>(() => writer.WriteByteArray(null)); Assert.Throws<ArgumentNullException>(() => writer.WriteIntArray(null)); // trying to read from non-readable stream Assert.Throws<ArgumentException>( () => writer.WriteByteArray("ByteStream", new NonReadableStream(), 0)); // finish too early Assert.Throws<NbtFormatException>(writer.Finish); writer.EndCompound(); writer.Finish(); // write tag after finishing Assert.Throws<NbtFormatException>(() => writer.WriteTag(new NbtInt())); } } }
public void ErrorTest() { byte[] dummyByteArray = { 1, 2, 3, 4, 5 }; int[] dummyIntArray = { 1, 2, 3, 4, 5 }; byte[] dummyBuffer = new byte[1024]; MemoryStream dummyStream = new MemoryStream(dummyByteArray); using (var ms = new MemoryStream()) { // null constructor parameters, or a non-writable stream Assert.Throws <ArgumentNullException>(() => new NbtWriter(null, "root")); Assert.Throws <ArgumentNullException>(() => new NbtWriter(ms, null)); Assert.Throws <ArgumentException>(() => new NbtWriter(new NonWritableStream(), "root")); var writer = new NbtWriter(ms, "root"); { // use negative list size Assert.Throws <ArgumentOutOfRangeException>(() => writer.BeginList("list", NbtTagType.Int, -1)); writer.BeginList("listOfLists", NbtTagType.List, 1); Assert.Throws <ArgumentOutOfRangeException>(() => writer.BeginList(NbtTagType.Int, -1)); writer.BeginList(NbtTagType.Int, 0); writer.EndList(); writer.EndList(); writer.BeginList("list", NbtTagType.Int, 1); // invalid list type Assert.Throws <ArgumentOutOfRangeException>(() => writer.BeginList(NbtTagType.End, 0)); Assert.Throws <ArgumentOutOfRangeException>(() => writer.BeginList("list", NbtTagType.End, 0)); // call EndCompound when not in a compound Assert.Throws <NbtFormatException>(writer.EndCompound); // end list before all elements have been written Assert.Throws <NbtFormatException>(writer.EndList); // write the wrong kind of tag inside a list Assert.Throws <NbtFormatException>(() => writer.WriteShort(0)); // write a named tag where an unnamed tag is expected Assert.Throws <NbtFormatException>(() => writer.WriteInt("NamedInt", 0)); // write too many list elements writer.WriteTag(new NbtInt()); Assert.Throws <NbtFormatException>(() => writer.WriteInt(0)); writer.EndList(); // write a null tag Assert.Throws <ArgumentNullException>(() => writer.WriteTag(null)); // write an unnamed tag where a named tag is expected Assert.Throws <NbtFormatException>(() => writer.WriteTag(new NbtInt())); Assert.Throws <NbtFormatException>(() => writer.WriteInt(0)); // end a list when not in a list Assert.Throws <NbtFormatException>(writer.EndList); // unacceptable nulls: WriteString Assert.Throws <ArgumentNullException>(() => writer.WriteString(null)); Assert.Throws <ArgumentNullException>(() => writer.WriteString("NullString", null)); // unacceptable nulls: WriteByteArray from array Assert.Throws <ArgumentNullException>(() => writer.WriteByteArray(null)); Assert.Throws <ArgumentNullException>(() => writer.WriteByteArray(null, 0, 5)); Assert.Throws <ArgumentNullException>(() => writer.WriteByteArray("NullByteArray", null)); Assert.Throws <ArgumentNullException>(() => writer.WriteByteArray("NullByteArray", null, 0, 5)); // unacceptable nulls: WriteByteArray from stream Assert.Throws <ArgumentNullException>(() => writer.WriteByteArray(null, 5)); Assert.Throws <ArgumentNullException>(() => writer.WriteByteArray(null, 5, null)); Assert.Throws <ArgumentNullException>(() => writer.WriteByteArray(dummyStream, 5, null)); Assert.Throws <ArgumentNullException>(() => writer.WriteByteArray("NullBuffer", dummyStream, 5, null)); Assert.Throws <ArgumentNullException>(() => writer.WriteByteArray("NullStream", null, 5)); Assert.Throws <ArgumentNullException>( () => writer.WriteByteArray("NullStream", null, 5, dummyByteArray)); // unacceptable nulls: WriteIntArray Assert.Throws <ArgumentNullException>(() => writer.WriteIntArray(null)); Assert.Throws <ArgumentNullException>(() => writer.WriteIntArray(null, 0, 5)); Assert.Throws <ArgumentNullException>(() => writer.WriteIntArray("NullIntArray", null)); Assert.Throws <ArgumentNullException>(() => writer.WriteIntArray("NullIntArray", null, 0, 5)); // non-readable streams are unacceptable Assert.Throws <ArgumentException>(() => writer.WriteByteArray(new NonReadableStream(), 0)); Assert.Throws <ArgumentException>( () => writer.WriteByteArray(new NonReadableStream(), 0, new byte[10])); Assert.Throws <ArgumentException>( () => writer.WriteByteArray("NonReadableStream", new NonReadableStream(), 0)); // trying to write array with out-of-range offset/count Assert.Throws <ArgumentOutOfRangeException>(() => writer.WriteByteArray(dummyByteArray, -1, 5)); Assert.Throws <ArgumentOutOfRangeException>(() => writer.WriteByteArray(dummyByteArray, 0, -1)); Assert.Throws <ArgumentException>(() => writer.WriteByteArray(dummyByteArray, 0, 6)); Assert.Throws <ArgumentException>(() => writer.WriteByteArray(dummyByteArray, 1, 5)); Assert.Throws <ArgumentOutOfRangeException>( () => writer.WriteByteArray("OutOfRangeByteArray", dummyByteArray, -1, 5)); Assert.Throws <ArgumentOutOfRangeException>( () => writer.WriteByteArray("OutOfRangeByteArray", dummyByteArray, 0, -1)); Assert.Throws <ArgumentException>( () => writer.WriteByteArray("OutOfRangeByteArray", dummyByteArray, 0, 6)); Assert.Throws <ArgumentException>( () => writer.WriteByteArray("OutOfRangeByteArray", dummyByteArray, 1, 5)); Assert.Throws <ArgumentOutOfRangeException>(() => writer.WriteIntArray(dummyIntArray, -1, 5)); Assert.Throws <ArgumentOutOfRangeException>(() => writer.WriteIntArray(dummyIntArray, 0, -1)); Assert.Throws <ArgumentException>(() => writer.WriteIntArray(dummyIntArray, 0, 6)); Assert.Throws <ArgumentException>(() => writer.WriteIntArray(dummyIntArray, 1, 5)); Assert.Throws <ArgumentOutOfRangeException>( () => writer.WriteIntArray("OutOfRangeIntArray", dummyIntArray, -1, 5)); Assert.Throws <ArgumentOutOfRangeException>( () => writer.WriteIntArray("OutOfRangeIntArray", dummyIntArray, 0, -1)); Assert.Throws <ArgumentException>( () => writer.WriteIntArray("OutOfRangeIntArray", dummyIntArray, 0, 6)); Assert.Throws <ArgumentException>( () => writer.WriteIntArray("OutOfRangeIntArray", dummyIntArray, 1, 5)); // out-of-range values for stream-reading overloads of WriteByteArray Assert.Throws <ArgumentOutOfRangeException>(() => writer.WriteByteArray(dummyStream, -1)); Assert.Throws <ArgumentOutOfRangeException>(() => writer.WriteByteArray("BadLength", dummyStream, -1)); Assert.Throws <ArgumentOutOfRangeException>( () => writer.WriteByteArray(dummyStream, -1, dummyByteArray)); Assert.Throws <ArgumentOutOfRangeException>( () => writer.WriteByteArray("BadLength", dummyStream, -1, dummyByteArray)); Assert.Throws <ArgumentException>(() => writer.WriteByteArray(dummyStream, 5, new byte[0])); Assert.Throws <ArgumentException>( () => writer.WriteByteArray("BadLength", dummyStream, 5, new byte[0])); // trying to read from non-readable stream Assert.Throws <ArgumentException>( () => writer.WriteByteArray("ByteStream", new NonReadableStream(), 0)); // finish too early Assert.Throws <NbtFormatException>(writer.Finish); writer.EndCompound(); writer.Finish(); // write tag after finishing Assert.Throws <NbtFormatException>(() => writer.WriteTag(new NbtInt())); } } }
public void ListTest() { // write short (1-element) lists of every possible kind using (var ms = new MemoryStream()) { var writer = new NbtWriter(ms, "Test"); writer.BeginList("LotsOfLists", NbtTagType.List, 11); { writer.BeginList(NbtTagType.Byte, 1); writer.WriteByte(1); writer.EndList(); writer.BeginList(NbtTagType.ByteArray, 1); writer.WriteByteArray(new byte[] { 1 }); writer.EndList(); writer.BeginList(NbtTagType.Compound, 1); writer.BeginCompound(); writer.EndCompound(); writer.EndList(); writer.BeginList(NbtTagType.Double, 1); writer.WriteDouble(1); writer.EndList(); writer.BeginList(NbtTagType.Float, 1); writer.WriteFloat(1); writer.EndList(); writer.BeginList(NbtTagType.Int, 1); writer.WriteInt(1); writer.EndList(); writer.BeginList(NbtTagType.IntArray, 1); writer.WriteIntArray(new[] { 1 }); writer.EndList(); writer.BeginList(NbtTagType.List, 1); writer.BeginList(NbtTagType.List, 0); writer.EndList(); writer.EndList(); writer.BeginList(NbtTagType.Long, 1); writer.WriteLong(1); writer.EndList(); writer.BeginList(NbtTagType.Short, 1); writer.WriteShort(1); writer.EndList(); writer.BeginList(NbtTagType.String, 1); writer.WriteString("ponies"); writer.EndList(); } writer.EndList(); Assert.IsFalse(writer.IsDone); writer.EndCompound(); Assert.IsTrue(writer.IsDone); writer.Finish(); ms.Position = 0; var reader = new NbtReader(ms); Assert.DoesNotThrow(() => reader.ReadAsTag()); } }
internal void SaveNBT(NbtWriter writer) { writer.BeginCompound(); // Identity writer.WriteInt("ID", Id); writer.WriteString("N", Name); if (DisplayedName != null) { writer.WriteString("DN", DisplayedName); } if (Email != null) { writer.WriteString("E", Email); } // Network information if (AccountType != AccountType.Unknown) { writer.WriteByte("AT", (byte)AccountType); } if (!Equals(LastIP, IPAddress.None)) { writer.WriteByteArray("IP", LastIP.GetAddressBytes()); } if (LastFailedLoginDate != DateTime.MinValue) { writer.WriteLong("LFD", LastFailedLoginDate.ToUnixTime()); writer.WriteByteArray("LFIP", LastFailedLoginIP.GetAddressBytes()); } if (BandwidthUseMode != BandwidthUseMode.Default) { writer.WriteByte("BUM", (byte)BandwidthUseMode); } // Online status writer.WriteLong("LFD", FirstLoginDate.ToUnixTime()); writer.WriteLong("LLD", LastLoginDate.ToUnixTime()); DateTime lastSeen; if (IsOnline) { lastSeen = DateTime.UtcNow; } else { lastSeen = LastSeen; } writer.WriteLong("LS", lastSeen.ToUnixTime()); writer.WriteByte("IH", (byte)(IsHidden ? 1 : 0)); // Rank information writer.WriteString("R", Rank.FullName); if (PreviousRank != null) { writer.WriteString("PR", PreviousRank.FullName); } if (RankChangeDate != DateTime.MinValue) { writer.WriteLong("RCD", RankChangeDate.ToUnixTime()); } if (RankChangedBy != null) { writer.WriteString("RCB", RankChangedBy); } if (RankChangeReason != null) { writer.WriteString("RCR", RankChangeReason); } writer.WriteByte("RCT", (byte)RankChangeType); // Kicks if (TimesKicked > 0) { writer.WriteInt("TK", TimesKicked); writer.WriteLong("LKD", LastKickDate.ToUnixTime()); if (LastKickBy != null) { writer.WriteString("LKB", LastKickBy); } if (LastKickReason != null) { writer.WriteString("LKR", LastKickReason); } } // Bans if (BanStatus != BanStatus.NotBanned) { writer.WriteByte("BS", (byte)BanStatus); } if (BanDate != DateTime.MinValue) { writer.WriteLong("BD", BanDate.ToUnixTime()); } if (BannedBy != null) { writer.WriteString("BB", BannedBy); } if (BanReason != null) { writer.WriteString("BR", BanReason); } if (UnbanDate != DateTime.MinValue) { writer.WriteLong("UD", UnbanDate.ToUnixTime()); } if (UnbannedBy != null) { writer.WriteString("UB", UnbannedBy); } if (UnbanReason != null) { writer.WriteString("UR", UnbanReason); } // Freeze if (IsFrozen) { writer.WriteByte("IF", 1); if (FrozenBy != null) { writer.WriteString("FB", FrozenBy); } writer.WriteLong("FD", FrozenOn.ToUnixTime()); } // Mute if (IsMuted) { writer.WriteLong("MU", MutedUntil.ToUnixTime()); if (MutedBy != null) { writer.WriteString("MB", MutedBy); } } // Stats writer.WriteInt("BBC", BlocksBuilt); writer.WriteInt("BDC", BlocksDeleted); writer.WriteLong("BRC", BlocksDrawn); writer.WriteInt("MW", MessagesWritten); writer.WriteInt("TV", TimesVisited); int seconds; Player pObject = PlayerObject; if (pObject != null) { seconds = (int)TotalTime.Add(TimeSinceLastLogin).TotalSeconds; } else { seconds = (int)TotalTime.TotalSeconds; } writer.WriteInt("TT", seconds); if (TimesKickedOthers > 0) { writer.WriteInt("TKO", TimesKickedOthers); } if (TimesBannedOthers > 0) { writer.WriteInt("TBO", TimesBannedOthers); } writer.EndCompound(); }
public void ErrorTest() { byte[] dummyByteArray = { 1, 2, 3, 4, 5 }; int[] dummyIntArray = { 1, 2, 3, 4, 5 }; byte[] dummyBuffer = new byte[1024]; MemoryStream dummyStream = new MemoryStream(dummyByteArray); using (var ms = new MemoryStream()) { // null constructor parameters, or a non-writable stream Assert.Throws<ArgumentNullException>(() => new NbtWriter(null, "root")); Assert.Throws<ArgumentNullException>(() => new NbtWriter(ms, null)); Assert.Throws<ArgumentException>(() => new NbtWriter(new NonWritableStream(), "root")); var writer = new NbtWriter(ms, "root"); { // use negative list size Assert.Throws<ArgumentOutOfRangeException>(() => writer.BeginList("list", NbtTagType.Int, -1)); writer.BeginList("listOfLists", NbtTagType.List, 1); Assert.Throws<ArgumentOutOfRangeException>(() => writer.BeginList(NbtTagType.Int, -1)); writer.BeginList(NbtTagType.Int, 0); writer.EndList(); writer.EndList(); writer.BeginList("list", NbtTagType.Int, 1); // invalid list type Assert.Throws<ArgumentOutOfRangeException>(() => writer.BeginList(NbtTagType.End, 0)); Assert.Throws<ArgumentOutOfRangeException>(() => writer.BeginList("list", NbtTagType.End, 0)); // call EndCompound when not in a compound Assert.Throws<NbtFormatException>(writer.EndCompound); // end list before all elements have been written Assert.Throws<NbtFormatException>(writer.EndList); // write the wrong kind of tag inside a list Assert.Throws<NbtFormatException>(() => writer.WriteShort(0)); // write a named tag where an unnamed tag is expected Assert.Throws<NbtFormatException>(() => writer.WriteInt("NamedInt", 0)); // write too many list elements writer.WriteTag(new NbtInt()); Assert.Throws<NbtFormatException>(() => writer.WriteInt(0)); writer.EndList(); // write a null tag Assert.Throws<ArgumentNullException>(() => writer.WriteTag(null)); // write an unnamed tag where a named tag is expected Assert.Throws<NbtFormatException>(() => writer.WriteTag(new NbtInt())); Assert.Throws<NbtFormatException>(() => writer.WriteInt(0)); // end a list when not in a list Assert.Throws<NbtFormatException>(writer.EndList); // unacceptable nulls: WriteString Assert.Throws<ArgumentNullException>(() => writer.WriteString(null)); Assert.Throws<ArgumentNullException>(() => writer.WriteString("NullString", null)); // unacceptable nulls: WriteByteArray from array Assert.Throws<ArgumentNullException>(() => writer.WriteByteArray(null)); Assert.Throws<ArgumentNullException>(() => writer.WriteByteArray(null, 0, 5)); Assert.Throws<ArgumentNullException>(() => writer.WriteByteArray("NullByteArray", null)); Assert.Throws<ArgumentNullException>(() => writer.WriteByteArray("NullByteArray", null, 0, 5)); // unacceptable nulls: WriteByteArray from stream Assert.Throws<ArgumentNullException>(() => writer.WriteByteArray(null, 5)); Assert.Throws<ArgumentNullException>(() => writer.WriteByteArray(null, 5, null)); Assert.Throws<ArgumentNullException>(() => writer.WriteByteArray(dummyStream, 5, null)); Assert.Throws<ArgumentNullException>(() => writer.WriteByteArray("NullBuffer", dummyStream, 5, null)); Assert.Throws<ArgumentNullException>(() => writer.WriteByteArray("NullStream", null, 5)); Assert.Throws<ArgumentNullException>( () => writer.WriteByteArray("NullStream", null, 5, dummyByteArray)); // unacceptable nulls: WriteIntArray Assert.Throws<ArgumentNullException>(() => writer.WriteIntArray(null)); Assert.Throws<ArgumentNullException>(() => writer.WriteIntArray(null, 0, 5)); Assert.Throws<ArgumentNullException>(() => writer.WriteIntArray("NullIntArray", null)); Assert.Throws<ArgumentNullException>(() => writer.WriteIntArray("NullIntArray", null, 0, 5)); // non-readable streams are unacceptable Assert.Throws<ArgumentException>(() => writer.WriteByteArray(new NonReadableStream(), 0)); Assert.Throws<ArgumentException>( () => writer.WriteByteArray(new NonReadableStream(), 0, new byte[10])); Assert.Throws<ArgumentException>( () => writer.WriteByteArray("NonReadableStream", new NonReadableStream(), 0)); // trying to write array with out-of-range offset/count Assert.Throws<ArgumentOutOfRangeException>(() => writer.WriteByteArray(dummyByteArray, -1, 5)); Assert.Throws<ArgumentOutOfRangeException>(() => writer.WriteByteArray(dummyByteArray, 0, -1)); Assert.Throws<ArgumentException>(() => writer.WriteByteArray(dummyByteArray, 0, 6)); Assert.Throws<ArgumentException>(() => writer.WriteByteArray(dummyByteArray, 1, 5)); Assert.Throws<ArgumentOutOfRangeException>( () => writer.WriteByteArray("OutOfRangeByteArray", dummyByteArray, -1, 5)); Assert.Throws<ArgumentOutOfRangeException>( () => writer.WriteByteArray("OutOfRangeByteArray", dummyByteArray, 0, -1)); Assert.Throws<ArgumentException>( () => writer.WriteByteArray("OutOfRangeByteArray", dummyByteArray, 0, 6)); Assert.Throws<ArgumentException>( () => writer.WriteByteArray("OutOfRangeByteArray", dummyByteArray, 1, 5)); Assert.Throws<ArgumentOutOfRangeException>(() => writer.WriteIntArray(dummyIntArray, -1, 5)); Assert.Throws<ArgumentOutOfRangeException>(() => writer.WriteIntArray(dummyIntArray, 0, -1)); Assert.Throws<ArgumentException>(() => writer.WriteIntArray(dummyIntArray, 0, 6)); Assert.Throws<ArgumentException>(() => writer.WriteIntArray(dummyIntArray, 1, 5)); Assert.Throws<ArgumentOutOfRangeException>( () => writer.WriteIntArray("OutOfRangeIntArray", dummyIntArray, -1, 5)); Assert.Throws<ArgumentOutOfRangeException>( () => writer.WriteIntArray("OutOfRangeIntArray", dummyIntArray, 0, -1)); Assert.Throws<ArgumentException>( () => writer.WriteIntArray("OutOfRangeIntArray", dummyIntArray, 0, 6)); Assert.Throws<ArgumentException>( () => writer.WriteIntArray("OutOfRangeIntArray", dummyIntArray, 1, 5)); // out-of-range values for stream-reading overloads of WriteByteArray Assert.Throws<ArgumentOutOfRangeException>(() => writer.WriteByteArray(dummyStream, -1)); Assert.Throws<ArgumentOutOfRangeException>(() => writer.WriteByteArray("BadLength", dummyStream, -1)); Assert.Throws<ArgumentOutOfRangeException>( () => writer.WriteByteArray(dummyStream, -1, dummyByteArray)); Assert.Throws<ArgumentOutOfRangeException>( () => writer.WriteByteArray("BadLength", dummyStream, -1, dummyByteArray)); Assert.Throws<ArgumentException>(() => writer.WriteByteArray(dummyStream, 5, new byte[0])); Assert.Throws<ArgumentException>( () => writer.WriteByteArray("BadLength", dummyStream, 5, new byte[0])); // trying to read from non-readable stream Assert.Throws<ArgumentException>( () => writer.WriteByteArray("ByteStream", new NonReadableStream(), 0)); // finish too early Assert.Throws<NbtFormatException>(writer.Finish); writer.EndCompound(); writer.Finish(); // write tag after finishing Assert.Throws<NbtFormatException>(() => writer.WriteTag(new NbtInt())); } } }