public void EndTagTest() { using (MemoryStream ms = new MemoryStream()) { var root = new NbtCompound("root") { new NbtInt("test", 0) }; new NbtFile(root).SaveToStream(ms, NbtCompression.None); ms.Position = 0; NbtReader reader = new NbtReader(ms) { SkipEndTags = false }; reader.ReadToDescendant("test"); Assert.AreEqual(NbtTagType.Int, reader.TagType); Assert.IsTrue(reader.ReadToNextSibling()); // should be at root's End tag now Assert.AreEqual(NbtTagType.End, reader.TagType); Assert.IsFalse(reader.IsInErrorState); Assert.IsFalse(reader.IsAtStreamEnd); Assert.IsFalse(reader.IsCompound); Assert.IsFalse(reader.IsList); Assert.IsFalse(reader.IsListElement); Assert.IsFalse(reader.HasValue); Assert.IsFalse(reader.HasName); Assert.IsFalse(reader.HasLength); Assert.Throws <InvalidOperationException>(() => reader.ReadAsTag()); // Cannot create NbtTag from TAG_END // We done now Assert.IsFalse(reader.ReadToFollowing()); Assert.IsTrue(reader.IsAtStreamEnd); } }
public void ErrorTest() { var root = new NbtCompound("root"); byte[] testData = new NbtFile(root).SaveToBuffer(NbtCompression.None); // creating NbtReader without a stream, or with a non-readable stream Assert.Throws <ArgumentNullException>(() => new NbtReader(null)); Assert.Throws <ArgumentException>(() => new NbtReader(new NonReadableStream())); // corrupt the data testData[0] = 123; var reader = new NbtReader(new MemoryStream(testData)); // attempt to use ReadValue when not at value Assert.Throws <InvalidOperationException>(() => reader.ReadValue()); reader.CacheTagValues = true; Assert.Throws <InvalidOperationException>(() => reader.ReadValue()); // attempt to read a corrupt stream Assert.Throws <NbtFormatException>(() => reader.ReadToFollowing()); // make sure we've properly entered the error state Assert.IsTrue(reader.IsInErrorState); Assert.IsFalse(reader.HasName); Assert.Throws <InvalidReaderStateException>(() => reader.ReadToFollowing()); Assert.Throws <InvalidReaderStateException>(() => reader.ReadListAsArray <int>()); Assert.Throws <InvalidReaderStateException>(() => reader.ReadToNextSibling()); Assert.Throws <InvalidReaderStateException>(() => reader.ReadToDescendant("derp")); Assert.Throws <InvalidReaderStateException>(() => reader.ReadAsTag()); Assert.Throws <InvalidReaderStateException>(() => reader.Skip()); }
public void ReadToSiblingTest() { NbtReader reader = new NbtReader(MakeTest()); Assert.IsTrue(reader.ReadToFollowing()); Assert.AreEqual(reader.TagName, "root"); Assert.IsTrue(reader.ReadToFollowing()); Assert.AreEqual(reader.TagName, "first"); Assert.IsTrue(reader.ReadToNextSibling("third-comp")); Assert.AreEqual(reader.TagName, "third-comp"); Assert.IsTrue(reader.ReadToNextSibling()); Assert.AreEqual(reader.TagName, "fourth-list"); Assert.IsTrue(reader.ReadToNextSibling()); Assert.AreEqual(reader.TagName, "fifth"); Assert.IsFalse(reader.ReadToNextSibling()); }
public Map LoadHeader(string path) { using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (GZipStream gs = new GZipStream(fs, CompressionMode.Decompress)) { NbtReader reader = new NbtReader(gs); reader.ReadToFollowing(); // skip root tag reader.ReadToFollowing(); // skip to first inner tag int width = 0, length = 0, height = 0; do { switch (reader.TagName) { case "X": width = reader.ReadValueAs <short>(); break; case "Y": height = reader.ReadValueAs <short>(); break; case "Z": length = reader.ReadValueAs <short>(); break; } if (width > 0 && length > 0 && height > 0) { return(new Map(null, width, length, height, false)); } } while (reader.ReadToNextSibling()); } } throw new MapFormatException("Could not locate map dimensions."); }
private static (string, Dictionary <string, Object>) GetNbtVal(MemoryStream ms) { string name = ""; var nbt = new NbtReader(ms, false); var dictParams = new Dictionary <string, Object>(); nbt.ReadToFollowing(); if (!nbt.IsCompound) { throw new Exception("Could not read nbt"); } if (nbt.ReadToDescendant("name")) { name = nbt.ReadValueAs <string>(); nbt.ReadToNextSibling(); while (nbt.TagType != NbtTagType.End) { fNbt.Tags.NbtTag tag = nbt.ReadAsTag(); switch (tag.Name) { case "version": continue; case "states": IEnumerable <fNbt.Tags.NbtTag> enumTag = (IEnumerable <fNbt.Tags.NbtTag>)tag; foreach (var subtag in enumTag) { if ((subtag.Name == "direction") || (subtag.Name == "facing_direction") || (subtag.Name == "open_bit")) { int subtagvalue = GetTagValue(subtag); dictParams.Add(subtag.Name, subtagvalue); } if ((subtag.Name == "color") || (subtag.Name == "lever_direction")) { if (subtag.TagType == NbtTagType.String) { dictParams.Add(subtag.Name, subtag.StringValue); } } } break; case "val": int value = GetTagValue(tag); dictParams.Add(tag.Name, value); break; } } } while (!nbt.IsAtStreamEnd) { nbt.ReadToFollowing(); } return(name, dictParams); }
private static (string, Dictionary <string, Object>) GetNbtVal(MemoryStream ms) { string name = ""; var nbt = new NbtReader(ms, false); var dictParams = new Dictionary <string, Object>(); nbt.ReadToFollowing(); if (!nbt.IsCompound) { throw new Exception("Could not read nbt"); } if (nbt.ReadToDescendant("name")) { name = nbt.ReadValueAs <string>(); nbt.ReadToNextSibling(); while (nbt.TagType != NbtTagType.End) { fNbt.Tags.NbtTag tag = nbt.ReadAsTag(); switch (tag.Name) { case "version": continue; case "states": IEnumerable <fNbt.Tags.NbtTag> enumTag = (IEnumerable <fNbt.Tags.NbtTag>)tag; foreach (var subtag in enumTag) { if ((subtag.Name == "direction") || (subtag.Name == "facing_direction") || (subtag.Name == "open_bit") || (subtag.Name == "multi_face_direction_bits") || (subtag.Name == "stripped_bit") || (subtag.Name == "wall_post_bit") || (subtag.Name == "button_pressed_bit") || (subtag.Name == "rail_direction") || (subtag.Name == "rail_data_bit") || (subtag.Name == "bite_counter") || (subtag.Name == "respawn_anchor_charge") || (subtag.Name == "growth") || (subtag.Name == "powered_bit") || (subtag.Name == "upper_block_bit") || (subtag.Name == "hanging") || (subtag.Name == "coral_direction") || (subtag.Name == "coral_hang_type_bit") || (subtag.Name == "dead_bit") || (subtag.Name == "end_portal_eye_bit") || (subtag.Name == "head_piece_bit") || (subtag.Name == "age")) { int subtagvalue = GetTagValue(subtag); dictParams.Add(subtag.Name, subtagvalue); } if ((subtag.Name == "color") || (subtag.Name == "lever_direction") || (subtag.Name == "wall_block_type") || (subtag.Name == "pillar_axis") || (subtag.Name == "wood_type") || (subtag.Name == "old_log_type") || (subtag.Name == "new_log_type") || (subtag.Name == "old_leaf_type") || (subtag.Name == "new_leaf_type") || (subtag.Name == "sapling_type") || subtag.Name.StartsWith("wall_connection_type_") || (subtag.Name == "chisel_type") || subtag.Name.StartsWith("stone_slab_type") || (subtag.Name == "sponge_type") || (subtag.Name == "double_plant_type") || (subtag.Name == "flower_type") || (subtag.Name == "sand_type") || (subtag.Name == "stone_type") || (subtag.Name == "damage") || (subtag.Name == "dripstone_thickness") || (subtag.Name == "coral_color") || (subtag.Name == "monster_egg_stone_type") || (subtag.Name == "stone_brick_type")) { dictParams.Add(subtag.Name, subtag.StringValue); } } break; case "val": int value = GetTagValue(tag); dictParams.Add(tag.Name, value); break; } } } while (!nbt.IsAtStreamEnd) { nbt.ReadToFollowing(); } return(name, dictParams); }
public void ReadToSiblingTest2() { var reader = new NbtReader(TestFiles.MakeReaderTest()); Assert.IsTrue(reader.ReadToFollowing("inComp1")); // Expect all siblings to be read while we search for a non-existent one Assert.IsFalse(reader.ReadToNextSibling("no such tag")); // Expect to pop out of "third-comp" by now Assert.AreEqual("fourth-list", reader.TagName); }
private static (string, int) GetNbtVal(MemoryStream ms) { int value = 0; string name = ""; var nbt = new NbtReader(ms, false); nbt.ReadToFollowing(); if (!nbt.IsCompound) { throw new Exception("Could not read nbt"); } if (nbt.ReadToDescendant("name")) { name = nbt.ReadValueAs <string>(); } if (nbt.ReadToNextSibling("val")) { switch (nbt.TagType) { case NbtTagType.Int: value = nbt.ReadValueAs <int>(); break; case NbtTagType.Short: value = nbt.ReadValueAs <short>(); break; case NbtTagType.Long: value = (int)nbt.ReadValueAs <long>(); break; default: Console.WriteLine("could not comprehend val"); break; } } while (!nbt.IsAtStreamEnd) { nbt.ReadToFollowing(); } return(name, value); }
public void ReadToSiblingTest() { var reader = new NbtReader(TestFiles.MakeReaderTest()); Assert.IsTrue(reader.ReadToFollowing()); Assert.AreEqual("root", reader.TagName); Assert.IsTrue(reader.ReadToFollowing()); Assert.AreEqual("first", reader.TagName); Assert.IsTrue(reader.ReadToNextSibling("third-comp")); Assert.AreEqual("third-comp", reader.TagName); Assert.IsTrue(reader.ReadToNextSibling()); Assert.AreEqual("fourth-list", reader.TagName); Assert.IsTrue(reader.ReadToNextSibling()); Assert.AreEqual("fifth", reader.TagName); Assert.IsTrue(reader.ReadToNextSibling()); Assert.AreEqual("hugeArray", reader.TagName); Assert.IsFalse(reader.ReadToNextSibling()); // Test twice, since we hit different paths through the code Assert.IsFalse(reader.ReadToNextSibling()); }
public void ErrorTest() { var root = new NbtCompound("root"); byte[] testData = new NbtFile(root).SaveToBuffer(NbtCompression.None); // creating NbtReader without a stream, or with a non-readable stream Assert.Throws<ArgumentNullException>(() => new NbtReader(null)); Assert.Throws<ArgumentException>(() => new NbtReader(new NonReadableStream())); // corrupt the data testData[0] = 123; var reader = new NbtReader(new MemoryStream(testData)); // attempt to use ReadValue when not at value Assert.Throws<InvalidOperationException>(() => reader.ReadValue()); reader.CacheTagValues = true; Assert.Throws<InvalidOperationException>(() => reader.ReadValue()); // attempt to read a corrupt stream Assert.Throws<NbtFormatException>(() => reader.ReadToFollowing()); // make sure we've properly entered the error state Assert.True(reader.IsInErrorState); Assert.False(reader.HasName); Assert.Throws<InvalidReaderStateException>(() => reader.ReadToFollowing()); Assert.Throws<InvalidReaderStateException>(() => reader.ReadListAsArray<int>()); Assert.Throws<InvalidReaderStateException>(() => reader.ReadToNextSibling()); Assert.Throws<InvalidReaderStateException>(() => reader.ReadToDescendant("derp")); Assert.Throws<InvalidReaderStateException>(() => reader.ReadAsTag()); Assert.Throws<InvalidReaderStateException>(() => reader.Skip()); }
public void ReadToSiblingTest() { var reader = new NbtReader(TestFiles.MakeReaderTest()); Assert.True(reader.ReadToFollowing()); Assert.Equal("root", reader.TagName); Assert.True(reader.ReadToFollowing()); Assert.Equal("first", reader.TagName); Assert.True(reader.ReadToNextSibling("third-comp")); Assert.Equal("third-comp", reader.TagName); Assert.True(reader.ReadToNextSibling()); Assert.Equal("fourth-list", reader.TagName); Assert.True(reader.ReadToNextSibling()); Assert.Equal("fifth", reader.TagName); Assert.True(reader.ReadToNextSibling()); Assert.Equal("hugeArray", reader.TagName); Assert.False(reader.ReadToNextSibling()); // Test twice, since we hit different paths through the code Assert.False(reader.ReadToNextSibling()); }
public Map LoadHeader(string path) { using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (GZipStream gs = new GZipStream(fs, CompressionMode.Decompress)) { NbtReader reader = new NbtReader(gs); reader.ReadToFollowing(); // skip root tag reader.ReadToFollowing(); // skip to first inner tag int width = 0, length = 0, height = 0; do { switch (reader.TagName) { case "X": width = reader.ReadValueAs<short>(); break; case "Y": height = reader.ReadValueAs<short>(); break; case "Z": length = reader.ReadValueAs<short>(); break; } if (width > 0 && length > 0 && height > 0) { return new Map(null, width, length, height, false); } } while (reader.ReadToNextSibling()); } } throw new MapFormatException("Could not locate map dimensions."); }
public void ReadToSiblingTest() { var reader = new NbtReader(TestFiles.MakeReaderTest()); Assert.IsTrue(reader.ReadToFollowing()); Assert.AreEqual(reader.TagName, "root"); Assert.IsTrue(reader.ReadToFollowing()); Assert.AreEqual(reader.TagName, "first"); Assert.IsTrue(reader.ReadToNextSibling("third-comp")); Assert.AreEqual(reader.TagName, "third-comp"); Assert.IsTrue(reader.ReadToNextSibling()); Assert.AreEqual(reader.TagName, "fourth-list"); Assert.IsTrue(reader.ReadToNextSibling()); Assert.AreEqual(reader.TagName, "fifth"); Assert.IsFalse(reader.ReadToNextSibling()); }