linux-packaging-mono/mcs/class/Mono.Data.Sqlite/Test/SqliteCommandUnitTests.cs
Xamarin Public Jenkins (auto-signing) 6123a772ed Imported Upstream version 5.8.0.88
Former-commit-id: 4b7216ffda08448e562271ce733688e761120fc5
2017-11-28 19:36:51 +00:00

210 lines
5.3 KiB
C#

// SqliteDataAdapterUnitTests.cs - NUnit Test Cases for Mono.Data.Sqlite.SqliteDataAdapter
//
// Author(s): Thomas Zoechling <thomas.zoechling@gmx.at>
using System;
using System.Data;
using System.IO;
using System.Text;
using Mono.Data.Sqlite;
using NUnit.Framework;
namespace MonoTests.Mono.Data.Sqlite
{
[TestFixture]
public class SqliteCommandUnitTests
{
string _uri;
string _connectionString;
SqliteConnection _conn;
readonly static string stringvalue = "my keyboard is better than yours : äöüß";
public SqliteCommandUnitTests()
{
}
[SetUp]
public void Create()
{
_uri = Path.GetTempFileName ();
_connectionString = "URI=file://" + _uri + ", version=3";
_conn = new SqliteConnection (_connectionString);
try
{
if(File.Exists(_uri))
{
_conn.Dispose();
// We want to start with a fresh db for each full run
// The database is created on the first open()
File.Delete(_uri);
}
}
catch(Exception e)
{
throw e;
}
try
{
using (SqliteCommand createCommand = new SqliteCommand("CREATE TABLE t1(t TEXT, f FLOAT, i INTEGER, b TEXT);", _conn))
using (SqliteCommand insertCommand = new SqliteCommand("INSERT INTO t1 (t, f, i, b ) VALUES('" + stringvalue + "',123,123,'123')", _conn))
{
_conn.Open();
createCommand.ExecuteNonQuery();
insertCommand.ExecuteNonQuery();
}
}
catch(Exception e)
{
Console.WriteLine (e);
throw new AssertionException("Create table failed",e);
}
finally
{
_conn.Close();
}
}
[TearDown]
public void TearDown ()
{
if (File.Exists (_uri))
File.Delete (_uri);
}
[Test]
public void Select()
{
using (_conn)
using (SqliteCommand simpleSelect = new SqliteCommand("SELECT * FROM t1; ", _conn)) // check trailing spaces
{
_conn.Open();
using (SqliteDataReader dr = simpleSelect.ExecuteReader())
{
while (dr.Read())
{
string test = dr[0].ToString();
Assert.AreEqual(dr["T"], stringvalue); // also checks case-insensitive column
Assert.AreEqual(dr["F"], 123);
Assert.AreEqual(dr["I"], 123);
Assert.AreEqual(dr["B"], "123");
}
Assert.IsTrue(dr.FieldCount>0);
}
}
}
[Test]
public void Delete()
{
using (_conn)
using (SqliteCommand insCmd = new SqliteCommand("INSERT INTO t1 VALUES ('todelete',0.1,0,'')", _conn))
using (SqliteCommand delCmd = new SqliteCommand("DELETE FROM t1 WHERE t = 'todelete'", _conn))
{
_conn.Open();
int insReturn = insCmd.ExecuteNonQuery();
int delReturn = delCmd.ExecuteNonQuery();
Assert.IsTrue(insReturn == delReturn);
}
}
[Test]
public void Insert()
{
using (_conn)
using (SqliteCommand insCmd = new SqliteCommand("INSERT INTO t1 VALUES ('inserted',0.1,0,'')", _conn))
{
_conn.Open();
int insReturn = insCmd.ExecuteNonQuery();
Assert.IsTrue(insReturn == 1);
}
}
[Test]
public void Update()
{
using (_conn)
using (SqliteCommand insCmd = new SqliteCommand("INSERT INTO t1 VALUES ('toupdate',0.1,0,'')", _conn))
using (SqliteCommand updCmd = new SqliteCommand("UPDATE t1 SET t = 'updated' ,f = 2.0, i = 2, b = '' WHERE t = 'toupdate'", _conn))
{
_conn.Open();
insCmd.ExecuteNonQuery();
Assert.IsTrue(updCmd.ExecuteNonQuery() == 1);
}
}
[Test]
public void ScalarReturn()
{
// This should return the 1 line that got inserted in CreateTable() Test
using (_conn)
using (SqliteCommand cmd = new SqliteCommand("SELECT COUNT(*) FROM t1 WHERE t LIKE '%äöüß'", _conn))
{
_conn.Open();
Assert.AreEqual(1, Convert.ToInt32(cmd.ExecuteScalar()));
}
}
[Test]
public void InsertWithTransaction()
{
_conn.Open();
using (_conn)
using (SqliteTransaction t = _conn.BeginTransaction() as SqliteTransaction)
using (SqliteCommand c1 = new SqliteCommand("INSERT INTO t1 VALUES ('a',0.1,0,'0')", _conn, t))
using (SqliteCommand c2 = new SqliteCommand("INSERT INTO t1 VALUES ('b',1.2,0,'0')", _conn, t))
using (SqliteCommand c3 = new SqliteCommand("INSERT INTO t1 VALUES ('c',0.3,1,'0')", _conn, t))
using (SqliteCommand c4 = new SqliteCommand("INSERT INTO t1 VALUES ('d',0.4,0,'1')", _conn, t))
{
try
{
c1.ExecuteNonQuery();
c2.ExecuteNonQuery();
c3.ExecuteNonQuery();
c4.ExecuteNonQuery();
t.Commit();
}
catch(Exception e)
{
t.Rollback();
throw new AssertionException("Sqlite Commands failed", e);
}
}
}
[Test]
[ExpectedException(typeof(SqliteException))]
public void InsertWithFailingTransaction()
{
_conn.Open();
using (_conn)
using (SqliteTransaction t = _conn.BeginTransaction() as SqliteTransaction)
using (SqliteCommand c1 = new SqliteCommand("INSERT INTO t1 VALUES ('1','0','0','0')", _conn, t))
using (SqliteCommand c2 = new SqliteCommand("INSERT INTO t1 VALUES ('0','1','0','0')", _conn, t))
using (SqliteCommand c3 = new SqliteCommand("INSERT INTO t1 VALUES ('x',?,'x',?,'x',?,'x')", _conn, t))
using (SqliteCommand c4 = new SqliteCommand("INSERT INTO t1 VALUES ('0','0','0','1')", _conn, t))
{
try
{
c1.ExecuteNonQuery();
c2.ExecuteNonQuery();
c3.ExecuteNonQuery();
c4.ExecuteNonQuery();
t.Commit();
}
catch(Exception e)
{
t.Rollback();
throw e;
}
}
}
}
}