Skip to content
This repository was archived by the owner on Nov 9, 2017. It is now read-only.

Commit e23a4c7

Browse files
committed
- Implemented tag queries
- Added the assembly info - Updated the README
1 parent 32ad6c0 commit e23a4c7

27 files changed

+843
-198
lines changed

LibNbt.Test/LibNbt.Test.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
<ItemGroup>
4444
<Compile Include="NbtFileTest.cs" />
4545
<Compile Include="Properties\AssemblyInfo.cs" />
46+
<Compile Include="Queries\TagQueryTest.cs" />
4647
</ItemGroup>
4748
<ItemGroup>
4849
<None Include="libs\NUnit-2.5.7\nunit.framework.dll">
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System.Reflection;
2+
using System.Runtime.CompilerServices;
3+
using System.Runtime.InteropServices;
4+
5+
// General Information about an assembly is controlled through the following
6+
// set of attributes. Change these attribute values to modify the information
7+
// associated with an assembly.
8+
[assembly: AssemblyTitle("LibNbt.Test")]
9+
[assembly: AssemblyDescription("LibNbt Unit Tests")]
10+
[assembly: AssemblyConfiguration("")]
11+
[assembly: AssemblyCompany("LibNbt Project - http://www.github.com/aphistic/libnbt/")]
12+
[assembly: AssemblyProduct("LibNbt.Test")]
13+
[assembly: AssemblyCopyright("2010, Erik Davidson")]
14+
[assembly: AssemblyTrademark("")]
15+
[assembly: AssemblyCulture("")]
16+
17+
// Setting ComVisible to false makes the types in this assembly not visible
18+
// to COM components. If you need to access a type in this assembly from
19+
// COM, set the ComVisible attribute to true on that type.
20+
[assembly: ComVisible(false)]
21+
22+
// The following GUID is for the ID of the typelib if this project is exposed to COM
23+
[assembly: Guid("37d4ff8c-3e40-4b11-a147-add3cdfb1c5f")]
24+
25+
// Version information for an assembly consists of the following four values:
26+
//
27+
// Major Version
28+
// Minor Version
29+
// Build Number
30+
// Revision
31+
//
32+
// You can specify all the values or you can default the Build and Revision Numbers
33+
// by using the '*' as shown below:
34+
// [assembly: AssemblyVersion("1.0.*")]
35+
[assembly: AssemblyVersion("0.2.0.0")]
36+
[assembly: AssemblyFileVersion("0.2.0.0")]

LibNbt.Test/Queries/TagQueryTest.cs

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
using LibNbt.Queries;
2+
using LibNbt.Tags;
3+
using NUnit.Framework;
4+
5+
namespace LibNbt.Test.Queries
6+
{
7+
[TestFixture]
8+
public class TagQueryTest
9+
{
10+
private NbtFile _file;
11+
12+
[TestFixtureSetUp]
13+
public void TagQueryTestSetUp()
14+
{
15+
_file = new NbtFile();
16+
_file.LoadFile("TestFiles/bigtest.nbt.gz");
17+
}
18+
19+
[Test]
20+
public void Tokenization()
21+
{
22+
var query = new TagQuery();
23+
TagQueryToken token;
24+
25+
// Expected: first
26+
query = new TagQuery("/first");
27+
Assert.AreEqual(1, query.Count());
28+
Assert.AreEqual(1, query.TokensLeft());
29+
token = query.Next();
30+
Assert.AreEqual("first", token.Name);
31+
Assert.AreSame(query, token.Query);
32+
Assert.AreEqual(0, query.TokensLeft());
33+
token = query.Next();
34+
Assert.IsNull(token);
35+
Assert.AreEqual(0, query.TokensLeft());
36+
37+
// Expected: first
38+
query.SetQuery("/first");
39+
Assert.AreEqual(1, query.Count());
40+
Assert.AreEqual(1, query.TokensLeft());
41+
token = query.Next();
42+
Assert.AreEqual("first", token.Name);
43+
Assert.AreSame(query, token.Query);
44+
Assert.AreEqual(0, query.TokensLeft());
45+
token = query.Next();
46+
Assert.IsNull(token);
47+
Assert.AreEqual(0, query.TokensLeft());
48+
49+
// Expected: first, second, third
50+
query.SetQuery("/first/second/third");
51+
Assert.AreEqual(3, query.Count());
52+
Assert.AreEqual(3, query.TokensLeft());
53+
token = query.Next();
54+
Assert.AreEqual("first", token.Name);
55+
Assert.AreSame(query, token.Query);
56+
Assert.AreEqual(2, query.TokensLeft());
57+
token = query.Next();
58+
Assert.AreEqual("second", token.Name);
59+
Assert.AreSame(query, token.Query);
60+
Assert.AreEqual(1, query.TokensLeft());
61+
token = query.Next();
62+
Assert.AreEqual("third", token.Name);
63+
Assert.AreSame(query, token.Query);
64+
Assert.AreEqual(0, query.TokensLeft());
65+
token = query.Next();
66+
Assert.IsNull(token);
67+
Assert.AreEqual(0, query.TokensLeft());
68+
69+
// Expected: first/slash, second\backslash, third!, extended/ÅÄÖ
70+
query.SetQuery(@"/first\/slash/second\\backslash/third!/extended\/ÅÄÖ");
71+
Assert.AreEqual(4, query.Count());
72+
Assert.AreEqual(4, query.TokensLeft());
73+
token = query.Next();
74+
Assert.AreEqual("first/slash", token.Name);
75+
Assert.AreSame(query, token.Query);
76+
Assert.AreEqual(3, query.TokensLeft());
77+
token = query.Next();
78+
Assert.AreEqual(@"second\backslash", token.Name);
79+
Assert.AreSame(query, token.Query);
80+
Assert.AreEqual(2, query.TokensLeft());
81+
token = query.Next();
82+
Assert.AreEqual("third!", token.Name);
83+
Assert.AreSame(query, token.Query);
84+
Assert.AreEqual(1, query.TokensLeft());
85+
token = query.Next();
86+
Assert.AreEqual("extended/ÅÄÖ", token.Name);
87+
Assert.AreSame(query, token.Query);
88+
Assert.AreEqual(0, query.TokensLeft());
89+
token = query.Next();
90+
Assert.IsNull(token);
91+
Assert.AreEqual(0, query.TokensLeft());
92+
}
93+
94+
[Test]
95+
public void MovingBetweenTokens()
96+
{
97+
var query = new TagQuery();
98+
TagQueryToken token;
99+
100+
query.SetQuery("/first/second/third/fourth/fifth/sixth");
101+
Assert.AreEqual(6, query.Count());
102+
Assert.AreEqual(6, query.TokensLeft());
103+
token = query.Previous();
104+
Assert.IsNull(token);
105+
Assert.AreEqual(6, query.TokensLeft());
106+
token = query.Next();
107+
Assert.AreEqual("first", token.Name);
108+
Assert.AreEqual(5, query.TokensLeft());
109+
token = query.Next();
110+
Assert.AreEqual("second", token.Name);
111+
Assert.AreEqual(4, query.TokensLeft());
112+
token = query.Next();
113+
Assert.AreEqual("third", token.Name);
114+
Assert.AreEqual(3, query.TokensLeft());
115+
token = query.Previous();
116+
Assert.AreEqual("second", token.Name);
117+
Assert.AreEqual(4, query.TokensLeft());
118+
token = query.Next();
119+
Assert.AreEqual("third", token.Name);
120+
Assert.AreEqual(3, query.TokensLeft());
121+
token = query.Peek();
122+
Assert.AreEqual("fourth", token.Name);
123+
Assert.AreEqual(3, query.TokensLeft());
124+
token = query.Next();
125+
Assert.AreEqual("fourth", token.Name);
126+
Assert.AreEqual(2, query.TokensLeft());
127+
token = query.Next();
128+
Assert.AreEqual("fifth", token.Name);
129+
Assert.AreEqual(1, query.TokensLeft());
130+
token = query.Next();
131+
Assert.AreEqual("sixth", token.Name);
132+
Assert.AreEqual(0, query.TokensLeft());
133+
token = query.Next();
134+
Assert.IsNull(token);
135+
Assert.AreEqual(0, query.TokensLeft());
136+
token = query.Previous();
137+
Assert.AreEqual("fifth", token.Name);
138+
Assert.AreEqual(1, query.TokensLeft());
139+
query.MoveFirst();
140+
Assert.AreEqual(6, query.TokensLeft());
141+
token = query.Next();
142+
Assert.AreEqual("first", token.Name);
143+
Assert.AreEqual(5, query.TokensLeft());
144+
}
145+
146+
[Test]
147+
public void Querying()
148+
{
149+
// To see the structure of this file take a look at TestFiles/bigtest.nbt.gz
150+
151+
var query = new TagQuery();
152+
NbtTag tag;
153+
154+
// Try to get the root node
155+
tag = _file.Query("/Level");
156+
Assert.IsNotNull(tag);
157+
Assert.IsInstanceOf<NbtCompound>(tag);
158+
Assert.AreEqual("Level", tag.Name);
159+
160+
tag = _file.Query("/Level/longTest");
161+
Assert.IsNotNull(tag);
162+
Assert.IsInstanceOf<NbtLong>(tag);
163+
Assert.AreEqual("longTest", tag.Name);
164+
165+
tag = _file.Query("/Level/shortTest");
166+
Assert.IsNotNull(tag);
167+
Assert.IsInstanceOf<NbtShort>(tag);
168+
Assert.AreEqual("shortTest", tag.Name);
169+
170+
tag = _file.Query("/Level/stringTest");
171+
Assert.IsNotNull(tag);
172+
Assert.IsInstanceOf<NbtString>(tag);
173+
Assert.AreEqual("stringTest", tag.Name);
174+
175+
tag = _file.Query("/Level/floatTest");
176+
Assert.IsNotNull(tag);
177+
Assert.IsInstanceOf<NbtFloat>(tag);
178+
Assert.AreEqual("floatTest", tag.Name);
179+
180+
tag = _file.Query("/Level/intTest");
181+
Assert.IsNotNull(tag);
182+
Assert.IsInstanceOf<NbtInt>(tag);
183+
Assert.AreEqual("intTest", tag.Name);
184+
185+
tag = _file.Query("/Level/nested compound test");
186+
Assert.IsNotNull(tag);
187+
Assert.IsInstanceOf<NbtCompound>(tag);
188+
Assert.AreEqual("nested compound test", tag.Name);
189+
190+
tag = _file.Query("/Level/nested compound test/ham/name");
191+
Assert.IsNotNull(tag);
192+
Assert.IsInstanceOf<NbtString>(tag);
193+
Assert.AreEqual("name", tag.Name);
194+
195+
tag = _file.Query("/Level/nested compound test/egg/name");
196+
Assert.IsNotNull(tag);
197+
Assert.IsInstanceOf<NbtString>(tag);
198+
Assert.AreEqual("name", tag.Name);
199+
200+
tag = _file.Query("/Level/listTest (long)/2");
201+
Assert.IsNotNull(tag);
202+
Assert.IsInstanceOf<NbtLong>(tag);
203+
Assert.AreEqual(13, ((NbtLong) tag).Value);
204+
205+
tag = _file.Query("/Level/listTest (compound)/1/name");
206+
Assert.IsNotNull(tag);
207+
Assert.IsInstanceOf<NbtString>(tag);
208+
Assert.AreEqual("Compound tag #1", ((NbtString) tag).Value);
209+
}
210+
}
211+
}

LibNbt.Test/TestFiles/bigtest.nbt

1.51 KB
Binary file not shown.

LibNbt.Test/TestFiles/test.nbt

33 Bytes
Binary file not shown.

LibNbt/AssemblyInfo.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace LibNbt.Exceptions
6+
{
7+
public class NbtQueryException : Exception
8+
{
9+
public NbtQueryException(string message) : base(message) { }
10+
}
11+
}

LibNbt/LibNbt.csproj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,11 @@
4141
</ItemGroup>
4242
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
4343
<ItemGroup>
44-
<Compile Include="AssemblyInfo.cs" />
44+
<Compile Include="Properties\AssemblyInfo.cs" />
45+
<Compile Include="Exceptions\NbtQueryException.cs" />
4546
<Compile Include="NbtFile.cs" />
47+
<Compile Include="Queries\TagQuery.cs" />
48+
<Compile Include="Queries\TagQueryToken.cs" />
4649
<Compile Include="Tags\INbtTagList.cs" />
4750
<Compile Include="Tags\INbtTagValue.cs" />
4851
<Compile Include="Tags\NbtByte.cs" />
@@ -58,4 +61,5 @@
5861
<Compile Include="Tags\NbtTag.cs" />
5962
<Compile Include="Tags\NbtTagType.cs" />
6063
</ItemGroup>
64+
<ItemGroup />
6165
</Project>

LibNbt/NbtFile.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using System.IO;
33
using System.IO.Compression;
4+
using LibNbt.Exceptions;
5+
using LibNbt.Queries;
46
using LibNbt.Tags;
57

68
namespace LibNbt
@@ -162,5 +164,16 @@ public virtual void SaveFile(Stream fileStream, bool compressed)
162164
}
163165
}
164166
}
167+
168+
public NbtTag Query(string query)
169+
{
170+
return Query<NbtTag>(query);
171+
}
172+
public T Query<T>(string query) where T : NbtTag
173+
{
174+
var tagQuery = new TagQuery(query);
175+
176+
return RootTag.Query<T>(tagQuery);
177+
}
165178
}
166179
}

LibNbt/Properties/AssemblyInfo.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System.Reflection;
2+
using System.Runtime.CompilerServices;
3+
using System.Runtime.InteropServices;
4+
5+
[assembly: AssemblyTitle("LibNbt")]
6+
[assembly: AssemblyDescription("A library to read and write NBT files.")]
7+
[assembly: AssemblyConfiguration("")]
8+
[assembly: AssemblyCompany("LibNbt Project - http://www.github.com/aphistic/libnbt/")]
9+
[assembly: AssemblyProduct("LibNbt")]
10+
[assembly: AssemblyCopyright("2010, Erik Davidson")]
11+
[assembly: AssemblyTrademark("")]
12+
[assembly: AssemblyCulture("")]
13+
14+
[assembly: ComVisible(false)]
15+
[assembly: Guid("9253db1f-f1d4-45aa-a277-4f3ba635d651")]
16+
17+
[assembly: AssemblyVersion("0.2.0.0")]
18+
[assembly: AssemblyFileVersion("0.2.0.0")]
19+
20+
// Allow the unit tests to see internal classes
21+
[assembly: InternalsVisibleTo("LibNbt.Test")]

0 commit comments

Comments
 (0)