Skip to content

Commit e36c879

Browse files
committed
Added cursor tests + cursor ext methods
Also project structure and Cursor menbers are refactored
1 parent aaa3352 commit e36c879

25 files changed

+835
-105
lines changed

src/LightningDB.Tests/CursorTests.cs

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Text;
6+
using NUnit.Framework;
7+
8+
namespace LightningDB.Tests
9+
{
10+
[TestFixture]
11+
public class CursorTests
12+
{
13+
private string _path;
14+
private LightningEnvironment _env;
15+
private LightningTransaction _txn;
16+
private LightningDatabase _db;
17+
18+
public CursorTests()
19+
{
20+
var location = typeof(EnvironmentTests).Assembly.Location;
21+
_path = Path.Combine(Path.GetDirectoryName(location), "TestDb");
22+
}
23+
24+
[SetUp]
25+
public void Init()
26+
{
27+
Directory.CreateDirectory(_path);
28+
29+
_env = new LightningEnvironment(_path, EnvironmentOpenFlags.None);
30+
_env.Open();
31+
32+
_txn = _env.BeginTransaction();
33+
_db = _txn.OpenDatabase();
34+
}
35+
36+
[TearDown]
37+
public void Cleanup()
38+
{
39+
_txn.Commit();
40+
_env.Close();
41+
42+
if (Directory.Exists(_path))
43+
Directory.Delete(_path, true);
44+
}
45+
46+
private void PopulateCursorValues()
47+
{
48+
using (var cur = _txn.CreateCursor(_db))
49+
{
50+
var keys = Enumerable.Range(1, 5)
51+
.Select(i => Encoding.UTF8.GetBytes("key" + i))
52+
.ToArray();
53+
54+
//act
55+
foreach (var k in keys)
56+
{
57+
cur.Put(k, k, PutOptions.None);
58+
}
59+
}
60+
}
61+
62+
[Test]
63+
public void CursorShouldBeCreated()
64+
{
65+
//arrange
66+
67+
//act
68+
69+
//assert
70+
_txn.CreateCursor(_db);
71+
}
72+
73+
[Test]
74+
public void CursorShouldPutValues()
75+
{
76+
//arrange
77+
78+
//act
79+
80+
//assert
81+
this.PopulateCursorValues();
82+
}
83+
84+
[Test]
85+
public void CursorShouldMoveToLast()
86+
{
87+
//arrange
88+
this.PopulateCursorValues();
89+
90+
//assert
91+
92+
using (var cur = _txn.CreateCursor(_db))
93+
{
94+
var last = cur.MoveToLast().Value;
95+
96+
var lastKey = Encoding.UTF8.GetString(last.Key);
97+
var lastValue = Encoding.UTF8.GetString(last.Value);
98+
99+
Assert.AreEqual("key5", lastKey);
100+
Assert.AreEqual("key5", lastValue);
101+
}
102+
}
103+
104+
[Test]
105+
public void CursorShouldMoveToFirst()
106+
{
107+
//arrange
108+
this.PopulateCursorValues();
109+
110+
//assert
111+
112+
using (var cur = _txn.CreateCursor(_db))
113+
{
114+
var last = cur.MoveToFirst().Value;
115+
116+
var lastKey = Encoding.UTF8.GetString(last.Key);
117+
var lastValue = Encoding.UTF8.GetString(last.Value);
118+
119+
Assert.AreEqual("key1", lastKey);
120+
Assert.AreEqual("key1", lastValue);
121+
}
122+
}
123+
124+
[Test]
125+
public void ShouldIterateThroughCursor()
126+
{
127+
//arrange
128+
this.PopulateCursorValues();
129+
130+
using (var cur = _txn.CreateCursor(_db))
131+
{
132+
var i = 0;
133+
134+
//act
135+
while (true)
136+
{
137+
var current = cur.MoveNext();
138+
if (!current.HasValue)
139+
break;
140+
141+
var key = Encoding.UTF8.GetString(current.Value.Key);
142+
var value = Encoding.UTF8.GetString(current.Value.Value);
143+
144+
var name = "key" + ++i;
145+
146+
//assert
147+
148+
Assert.AreEqual(name, key);
149+
Assert.AreEqual(name, value);
150+
}
151+
}
152+
}
153+
154+
[Test]
155+
public void ShouldIterateThroughCursorByExtensions()
156+
{
157+
//arrange
158+
this.PopulateCursorValues();
159+
160+
using (var cur = _txn.CreateCursor(_db))
161+
{
162+
var i = 0;
163+
164+
//act
165+
for(var current = cur.MoveToFirstBy(); current.PairExists; current = cur.MoveNextBy())
166+
{
167+
var pair = current.Pair<string, string>();
168+
var name = "key" + ++i;
169+
170+
//assert
171+
172+
Assert.AreEqual(name, pair.Key);
173+
Assert.AreEqual(name, pair.Value);
174+
}
175+
}
176+
}
177+
178+
[Test]
179+
public void CursorShouldDeleteElements()
180+
{
181+
//arrange
182+
this.PopulateCursorValues();
183+
184+
using (var cur = _txn.CreateCursor(_db))
185+
{
186+
var i = 0;
187+
188+
//act
189+
for (var current = cur.MoveToFirstBy(); current.PairExists && i < 2; current = cur.MoveNextBy(), i++)
190+
{
191+
cur.Delete();
192+
}
193+
194+
//assert
195+
for (var current = cur.MoveToFirstBy(); current.PairExists; current = cur.MoveNextBy())
196+
{
197+
var key = current.Key<string>();
198+
199+
Assert.AreNotEqual("key1", key);
200+
Assert.AreNotEqual("key2", key);
201+
}
202+
}
203+
}
204+
205+
[Test]
206+
public void ShouldIterateThroughCursorByEnumerator()
207+
{
208+
//arrange
209+
this.PopulateCursorValues();
210+
211+
var i = 0;
212+
foreach (var pair in _txn.EnumerateDatabase<string, string>(_db))
213+
{
214+
var name = "key" + ++i;
215+
216+
//assert
217+
218+
Assert.AreEqual(name, pair.Key);
219+
Assert.AreEqual(name, pair.Value);
220+
}
221+
}
222+
}
223+
}

src/LightningDB.Tests/LightningDB.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
<Otherwise />
6969
</Choose>
7070
<ItemGroup>
71+
<Compile Include="CursorTests.cs" />
7172
<Compile Include="DatabaseIOTests.cs" />
7273
<Compile Include="DatabaseTests.cs" />
7374
<Compile Include="EnvironmentTests.cs" />
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace LightningDB.Collections
8+
{
9+
class CursorGenericEnumerable<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>
10+
{
11+
private LightningTransaction _tx;
12+
private LightningDatabase _db;
13+
14+
public CursorGenericEnumerable(LightningTransaction tx, LightningDatabase db)
15+
{
16+
if (tx == null)
17+
throw new ArgumentNullException("tx");
18+
19+
if (db == null)
20+
throw new ArgumentNullException("db");
21+
22+
_tx = tx;
23+
_db = db;
24+
}
25+
26+
#region IEnumerable<KeyValuePair<TKey,TValue>> Members
27+
28+
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
29+
{
30+
var cur = _tx.CreateCursor(_db);
31+
32+
return new CursorGenericEnumerator<TKey, TValue>(cur);
33+
}
34+
35+
#endregion
36+
37+
#region IEnumerable Members
38+
39+
IEnumerator IEnumerable.GetEnumerator()
40+
{
41+
return this.GetEnumerator();
42+
}
43+
44+
#endregion
45+
}
46+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace LightningDB.Collections
8+
{
9+
class CursorEnumerator : IEnumerator<CursorGetByOperation>
10+
{
11+
private LightningCursor _cur;
12+
13+
public CursorEnumerator(LightningCursor cur)
14+
{
15+
_cur = cur;
16+
}
17+
18+
#region IEnumerator<CursorGetByOperation> Members
19+
20+
public CursorGetByOperation Current { get; private set; }
21+
22+
#endregion
23+
24+
#region IDisposable Members
25+
26+
public void Dispose()
27+
{
28+
if (_cur != null)
29+
_cur.Dispose();
30+
}
31+
32+
#endregion
33+
34+
#region IEnumerator Members
35+
36+
object IEnumerator.Current { get { return this.Current; } }
37+
38+
public bool MoveNext()
39+
{
40+
var next = _cur.MoveNextBy();
41+
42+
this.Current = next.PairExists
43+
? next
44+
: null;
45+
46+
return next.PairExists;
47+
}
48+
49+
public void Reset()
50+
{
51+
_cur.Renew();
52+
}
53+
54+
#endregion
55+
}
56+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace LightningDB.Collections
8+
{
9+
class CursorEnumerable : IEnumerable<CursorGetByOperation>
10+
{
11+
private LightningTransaction _tx;
12+
private LightningDatabase _db;
13+
14+
public CursorEnumerable(LightningTransaction tx, LightningDatabase db)
15+
{
16+
if (tx == null)
17+
throw new ArgumentNullException("tx");
18+
19+
if (db == null)
20+
throw new ArgumentNullException("db");
21+
22+
_tx = tx;
23+
_db = db;
24+
}
25+
26+
#region IEnumerable<CursorGetByOperation> Members
27+
28+
public IEnumerator<CursorGetByOperation> GetEnumerator()
29+
{
30+
var cur = _tx.CreateCursor(_db);
31+
32+
return new CursorEnumerator(cur);
33+
}
34+
35+
#endregion
36+
37+
#region IEnumerable Members
38+
39+
IEnumerator IEnumerable.GetEnumerator()
40+
{
41+
return this.GetEnumerator();
42+
}
43+
44+
#endregion
45+
}
46+
}

0 commit comments

Comments
 (0)