summaryrefslogtreecommitdiff
path: root/test/scr037/HashCursorTest.cs
diff options
context:
space:
mode:
Diffstat (limited to 'test/scr037/HashCursorTest.cs')
-rw-r--r--test/scr037/HashCursorTest.cs237
1 files changed, 237 insertions, 0 deletions
diff --git a/test/scr037/HashCursorTest.cs b/test/scr037/HashCursorTest.cs
new file mode 100644
index 0000000..1dd4cfb
--- /dev/null
+++ b/test/scr037/HashCursorTest.cs
@@ -0,0 +1,237 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2009 Oracle. All rights reserved.
+ *
+ */
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Threading;
+using NUnit.Framework;
+using BerkeleyDB;
+
+namespace CsharpAPITest
+{
+ [TestFixture]
+ public class HashCursorTest
+ {
+ private string testFixtureName;
+ private string testFixtureHome;
+ private string testName;
+ private string testHome;
+
+ [TestFixtureSetUp]
+ public void RunBeforeTests()
+ {
+ testFixtureName = "HashCursorTest";
+ testFixtureHome = "./TestOut/" + testFixtureName;
+ }
+
+ [Test]
+ public void TestAddToLoc()
+ {
+ HashDatabase db;
+ HashCursor cursor;
+ KeyValuePair<DatabaseEntry, DatabaseEntry> pair;
+
+ testName = "TestAddToLoc";
+ testHome = testFixtureHome + "/" + testName;
+
+ Configuration.ClearDir(testHome);
+
+ /*
+ * Open a hash database and cursor and then
+ * add record("key", "data") into database.
+ */
+ GetHashDBAndCursor(testHome, testName, out db, out cursor);
+ AddOneByCursor(cursor);
+
+ /*
+ * Add the new record("key","data1") as the first
+ * of the data item of "key".
+ */
+ pair = new KeyValuePair<DatabaseEntry, DatabaseEntry>(
+ new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("key")),
+ new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("data1")));
+ cursor.Add(pair, Cursor.InsertLocation.FIRST);
+
+ /*
+ * Confirm that the new record is added as the first of
+ * the data item of "key".
+ */
+ cursor.Move(new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("key")), true);
+ Assert.AreEqual(ASCIIEncoding.ASCII.GetBytes("data1"),
+ cursor.Current.Value.Data);
+
+ cursor.Close();
+ db.Close();
+ }
+
+ [Test]
+ public void TestAddUnique()
+ {
+ HashDatabase db;
+ HashCursor cursor;
+ KeyValuePair<DatabaseEntry, DatabaseEntry> pair;
+
+ testName = "TestAddUnique";
+ testHome = testFixtureHome + "/" + testName;
+
+ Configuration.ClearDir(testHome);
+
+ // Open a database and cursor.
+ HashDatabaseConfig dbConfig = new HashDatabaseConfig();
+ dbConfig.Creation = CreatePolicy.IF_NEEDED;
+
+ /*
+ * To put no duplicate data, the database should be
+ * set to be sorted.
+ */
+ dbConfig.Duplicates = DuplicatesPolicy.SORTED;
+ db = HashDatabase.Open(
+ testHome + "/" + testName + ".db", dbConfig);
+ cursor = db.Cursor();
+
+ // Add record("key", "data") into database.
+ AddOneByCursor(cursor);
+
+ /*
+ * Fail to add duplicate record("key","data").
+ */
+ pair = new KeyValuePair<DatabaseEntry, DatabaseEntry>(
+ new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("key")),
+ new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("data")));
+ try
+ {
+ cursor.AddUnique(pair);
+ }
+ catch (KeyExistException)
+ {
+ }
+ finally
+ {
+ cursor.Close();
+ db.Close();
+ }
+ }
+
+ [Test]
+ public void TestDuplicate()
+ {
+ HashDatabase db;
+ HashCursor cursor, dupCursor;
+ KeyValuePair<DatabaseEntry, DatabaseEntry> pair;
+
+ testName = "TestDuplicate";
+ testHome = testFixtureHome + "/" + testName;
+
+ Configuration.ClearDir(testHome);
+
+ GetHashDBAndCursor(testHome, testName,
+ out db, out cursor);
+
+ /*
+ * Add a record("key", "data") by cursor and move
+ * the cursor to the current record.
+ */
+ AddOneByCursor(cursor);
+ cursor.Refresh();
+
+ //Duplicate a new cursor to the same position.
+ dupCursor = cursor.Duplicate(true);
+
+ // Overwrite the record.
+ dupCursor.Overwrite(new DatabaseEntry(
+ ASCIIEncoding.ASCII.GetBytes("newdata")));
+
+ // Confirm that the original data doesn't exist.
+ pair = new KeyValuePair<DatabaseEntry, DatabaseEntry>(
+ new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("key")),
+ new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("data")));
+ Assert.IsFalse(dupCursor.Move(pair, true));
+
+ dupCursor.Close();
+ cursor.Close();
+ db.Close();
+ }
+
+ [Test]
+ public void TestInsertToLoc()
+ {
+ HashDatabase db;
+ HashDatabaseConfig dbConfig;
+ HashCursor cursor;
+ DatabaseEntry data;
+ KeyValuePair<DatabaseEntry, DatabaseEntry> pair;
+ string dbFileName;
+
+ testName = "TestInsertToLoc";
+ testHome = testFixtureHome + "/" + testName;
+ dbFileName = testHome + "/" + testName + ".db";
+
+ Configuration.ClearDir(testHome);
+
+ // Open database and cursor.
+ dbConfig = new HashDatabaseConfig();
+ dbConfig.Creation = CreatePolicy.IF_NEEDED;
+
+ /*
+ * The database should be set to be unsorted to
+ * insert before/after a certain record.
+ */
+ dbConfig.Duplicates = DuplicatesPolicy.UNSORTED;
+ db = HashDatabase.Open(dbFileName, dbConfig);
+ cursor = db.Cursor();
+
+ // Add record("key", "data") into database.
+ AddOneByCursor(cursor);
+
+ /*
+ * Insert the new record("key","data1") after the
+ * record("key", "data").
+ */
+ data = new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("data1"));
+ cursor.Insert(data, Cursor.InsertLocation.AFTER);
+
+ /*
+ * Move the cursor to the record("key", "data") and
+ * confirm that the next record is the one just inserted.
+ */
+ pair = new KeyValuePair<DatabaseEntry, DatabaseEntry>(
+ new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("key")),
+ new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("data")));
+ Assert.IsTrue(cursor.Move(pair, true));
+ Assert.IsTrue(cursor.MoveNext());
+ Assert.AreEqual(ASCIIEncoding.ASCII.GetBytes("key"),
+ cursor.Current.Key.Data);
+ Assert.AreEqual(ASCIIEncoding.ASCII.GetBytes("data1"),
+ cursor.Current.Value.Data);
+
+ cursor.Close();
+ db.Close();
+ }
+
+ public void GetHashDBAndCursor(string home, string name,
+ out HashDatabase db, out HashCursor cursor)
+ {
+ string dbFileName = home + "/" + name + ".db";
+ HashDatabaseConfig dbConfig = new HashDatabaseConfig();
+ dbConfig.Creation = CreatePolicy.IF_NEEDED;
+ db = HashDatabase.Open(dbFileName, dbConfig);
+ cursor = db.Cursor();
+ }
+
+ public void AddOneByCursor(HashCursor cursor)
+ {
+ DatabaseEntry key, data;
+ KeyValuePair<DatabaseEntry, DatabaseEntry> pair;
+ key = new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("key"));
+ data = new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("data"));
+ pair = new KeyValuePair<DatabaseEntry,DatabaseEntry>(key, data);
+ cursor.Add(pair);
+ }
+ }
+}