using System; using System.Collections.Generic; using System.Linq; using System.Text; using SQLite; #if NETFX_CORE using Microsoft.VisualStudio.TestPlatform.UnitTestFramework; using SetUp = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestInitializeAttribute; using TestFixture = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestClassAttribute; using Test = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestMethodAttribute; #else using NUnit.Framework; #endif using System.IO; namespace SQLite.Tests { [TestFixture] public class NullableTest { public class NullableIntClass { [PrimaryKey, AutoIncrement] public int ID { get; set; } public Nullable NullableInt { get; set; } public override bool Equals(object obj) { NullableIntClass other = (NullableIntClass)obj; return this.ID == other.ID && this.NullableInt == other.NullableInt; } public override int GetHashCode () { return ID.GetHashCode () + NullableInt.GetHashCode (); } } [Test] [Description("Create a table with a nullable int column then insert and select against it")] public void NullableInt() { SQLiteConnection db = new SQLiteConnection(TestPath.GetTempFileName()); db.CreateTable(); NullableIntClass withNull = new NullableIntClass() { NullableInt = null }; NullableIntClass with0 = new NullableIntClass() { NullableInt = 0 }; NullableIntClass with1 = new NullableIntClass() { NullableInt = 1 }; NullableIntClass withMinus1 = new NullableIntClass() { NullableInt = -1 }; db.Insert(withNull); db.Insert(with0); db.Insert(with1); db.Insert(withMinus1); NullableIntClass[] results = db.Table().OrderBy(x => x.ID).ToArray(); Assert.AreEqual(4, results.Length); Assert.AreEqual(withNull, results[0]); Assert.AreEqual(with0, results[1]); Assert.AreEqual(with1, results[2]); Assert.AreEqual(withMinus1, results[3]); } public class NullableFloatClass { [PrimaryKey, AutoIncrement] public int ID { get; set; } public Nullable NullableFloat { get; set; } public override bool Equals(object obj) { NullableFloatClass other = (NullableFloatClass)obj; return this.ID == other.ID && this.NullableFloat == other.NullableFloat; } public override int GetHashCode () { return ID.GetHashCode () + NullableFloat.GetHashCode (); } } [Test] [Description("Create a table with a nullable int column then insert and select against it")] public void NullableFloat() { SQLiteConnection db = new SQLiteConnection(TestPath.GetTempFileName()); db.CreateTable(); NullableFloatClass withNull = new NullableFloatClass() { NullableFloat = null }; NullableFloatClass with0 = new NullableFloatClass() { NullableFloat = 0 }; NullableFloatClass with1 = new NullableFloatClass() { NullableFloat = 1 }; NullableFloatClass withMinus1 = new NullableFloatClass() { NullableFloat = -1 }; db.Insert(withNull); db.Insert(with0); db.Insert(with1); db.Insert(withMinus1); NullableFloatClass[] results = db.Table().OrderBy(x => x.ID).ToArray(); Assert.AreEqual(4, results.Length); Assert.AreEqual(withNull, results[0]); Assert.AreEqual(with0, results[1]); Assert.AreEqual(with1, results[2]); Assert.AreEqual(withMinus1, results[3]); } public class StringClass { [PrimaryKey, AutoIncrement] public int ID { get; set; } //Strings are allowed to be null by default public string StringData { get; set; } public override bool Equals(object obj) { StringClass other = (StringClass)obj; return this.ID == other.ID && this.StringData == other.StringData; } public override int GetHashCode () { return ID.GetHashCode () + StringData.GetHashCode (); } } [Test] public void NullableString() { SQLiteConnection db = new SQLiteConnection(TestPath.GetTempFileName()); db.CreateTable(); StringClass withNull = new StringClass() { StringData = null }; StringClass withEmpty = new StringClass() { StringData = "" }; StringClass withData = new StringClass() { StringData = "data" }; db.Insert(withNull); db.Insert(withEmpty); db.Insert(withData); StringClass[] results = db.Table().OrderBy(x => x.ID).ToArray(); Assert.AreEqual(3, results.Length); Assert.AreEqual(withNull, results[0]); Assert.AreEqual(withEmpty, results[1]); Assert.AreEqual(withData, results[2]); } [Test] public void WhereNotNull() { SQLiteConnection db = new SQLiteConnection(TestPath.GetTempFileName()); db.CreateTable(); NullableIntClass withNull = new NullableIntClass() { NullableInt = null }; NullableIntClass with0 = new NullableIntClass() { NullableInt = 0 }; NullableIntClass with1 = new NullableIntClass() { NullableInt = 1 }; NullableIntClass withMinus1 = new NullableIntClass() { NullableInt = -1 }; db.Insert(withNull); db.Insert(with0); db.Insert(with1); db.Insert(withMinus1); NullableIntClass[] results = db.Table().Where(x => x.NullableInt != null).OrderBy(x => x.ID).ToArray(); Assert.AreEqual(3, results.Length); Assert.AreEqual(with0, results[0]); Assert.AreEqual(with1, results[1]); Assert.AreEqual(withMinus1, results[2]); } [Test] public void WhereNull() { SQLiteConnection db = new SQLiteConnection(TestPath.GetTempFileName()); db.CreateTable(); NullableIntClass withNull = new NullableIntClass() { NullableInt = null }; NullableIntClass with0 = new NullableIntClass() { NullableInt = 0 }; NullableIntClass with1 = new NullableIntClass() { NullableInt = 1 }; NullableIntClass withMinus1 = new NullableIntClass() { NullableInt = -1 }; db.Insert(withNull); db.Insert(with0); db.Insert(with1); db.Insert(withMinus1); NullableIntClass[] results = db.Table().Where(x => x.NullableInt == null).OrderBy(x => x.ID).ToArray(); Assert.AreEqual(1, results.Length); Assert.AreEqual(withNull, results[0]); } [Test] public void StringWhereNull() { SQLiteConnection db = new SQLiteConnection(TestPath.GetTempFileName()); db.CreateTable(); StringClass withNull = new StringClass() { StringData = null }; StringClass withEmpty = new StringClass() { StringData = "" }; StringClass withData = new StringClass() { StringData = "data" }; db.Insert(withNull); db.Insert(withEmpty); db.Insert(withData); StringClass[] results = db.Table().Where(x => x.StringData == null).OrderBy(x => x.ID).ToArray(); Assert.AreEqual(1, results.Length); Assert.AreEqual(withNull, results[0]); } [Test] public void StringWhereNotNull() { SQLiteConnection db = new SQLiteConnection(TestPath.GetTempFileName()); db.CreateTable(); StringClass withNull = new StringClass() { StringData = null }; StringClass withEmpty = new StringClass() { StringData = "" }; StringClass withData = new StringClass() { StringData = "data" }; db.Insert(withNull); db.Insert(withEmpty); db.Insert(withData); StringClass[] results = db.Table().Where(x => x.StringData != null).OrderBy(x => x.ID).ToArray(); Assert.AreEqual(2, results.Length); Assert.AreEqual(withEmpty, results[0]); Assert.AreEqual(withData, results[1]); } public enum TestIntEnum { One = 1, Two = 2, } [StoreAsText] public enum TestTextEnum { Alpha, Beta, } public class NullableEnumClass { [PrimaryKey, AutoIncrement] public int ID { get; set; } public TestIntEnum? NullableIntEnum { get; set; } public TestTextEnum? NullableTextEnum { get; set; } public override bool Equals (object obj) { var other = (NullableEnumClass)obj; return this.ID == other.ID && this.NullableIntEnum == other.NullableIntEnum && this.NullableTextEnum == other.NullableTextEnum; } public override int GetHashCode () { return ID.GetHashCode () + NullableIntEnum.GetHashCode () + NullableTextEnum.GetHashCode (); } public override string ToString () { return string.Format ("[NullableEnumClass: ID={0}, NullableIntEnum={1}, NullableTextEnum={2}]", ID, NullableIntEnum, NullableTextEnum); } } [Test] [Description ("Create a table with a nullable enum column then insert and select against it")] public void NullableEnum () { SQLiteConnection db = new SQLiteConnection (TestPath.GetTempFileName ()); db.CreateTable (); var withNull = new NullableEnumClass { NullableIntEnum = null, NullableTextEnum = null }; var with1 = new NullableEnumClass { NullableIntEnum = TestIntEnum.One, NullableTextEnum = null }; var with2 = new NullableEnumClass { NullableIntEnum = TestIntEnum.Two, NullableTextEnum = null }; var withNullA = new NullableEnumClass { NullableIntEnum = null, NullableTextEnum = TestTextEnum.Alpha }; var with1B = new NullableEnumClass { NullableIntEnum = TestIntEnum.One, NullableTextEnum = TestTextEnum.Beta }; db.Insert (withNull); db.Insert (with1); db.Insert (with2); db.Insert (withNullA); db.Insert (with1B); var results = db.Table ().OrderBy (x => x.ID).ToArray (); Assert.AreEqual (5, results.Length); Assert.AreEqual (withNull, results[0]); Assert.AreEqual (with1, results[1]); Assert.AreEqual (with2, results[2]); Assert.AreEqual (withNullA, results[3]); Assert.AreEqual (with1B, results[4]); } } }