#region MIT license
//
// MIT license
//
// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using NUnit.Framework;
using Test_NUnit;
using System.Data.Linq.Mapping;
using nwind;
#if MONO_STRICT
using DataLinq = System.Data.Linq;
#else
using DataLinq = DbLinq.Data.Linq;
#endif
namespace nwind
{
interface IHasAddress
{
string Address { get; set; }
}
partial class Customer : IHasAddress
{
}
partial class Employee : IHasAddress
{
}
}
// test ns
#if MYSQL
namespace Test_NUnit_MySql
#elif ORACLE && ODP
namespace Test_NUnit_OracleODP
#elif ORACLE
namespace Test_NUnit_Oracle
#elif POSTGRES
namespace Test_NUnit_PostgreSql
#elif SQLITE
namespace Test_NUnit_Sqlite
#elif INGRES
namespace Test_NUnit_Ingres
#elif MSSQL && L2SQL
namespace Test_NUnit_MsSql_Strict
#elif MSSQL
namespace Test_NUnit_MsSql
#elif FIREBIRD
namespace Test_NUnit_Firebird
#endif
{
[TestFixture]
public class ReadTest : TestBase
{
#region Tests 'A' check for DB being ready
///
/// in NUnit, tests are executed in alpha order.
/// We want to start by checking access to DB.
///
[Test]
public void A1_PingDatabase()
{
Northwind db = CreateDB();
bool pingOK = db.DatabaseExists();
//bool pingOK = Conn.Ping(); //Schildkroete - Ping throws NullRef if conn is not open
Assert.IsTrue(pingOK, "Pinging database");
}
#if !DEBUG && (MSSQL && L2SQL)
// L2SQL doesn't support 'SELECT' queries in DataContext.ExecuteCommand().
[Explicit]
#endif
[Test]
public void A3_ProductsTableHasPen()
{
Northwind db = CreateDB();
//string sql = @"SELECT count(*) FROM linqtestdb.Products WHERE ProductName='Chai'";
string sql = @"SELECT count(*) FROM [Products] WHERE [ProductName]='Chai'";
long iResult = db.ExecuteCommand(sql);
//long iResult = base.ExecuteScalar(sql);
Assert.AreEqual(iResult, 1L, "Expecting one Chai in Products table, got:" + iResult + " (SQL:" + sql + ")");
}
[Test]
public void A4_SelectSingleCustomer()
{
Northwind db = CreateDB();
// Query for a specific customer
var cust = db.Customers.Single(c => c.CompanyName == "Around the Horn");
Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");
var id = 1;
var prod = db.Products.Single(p => p.ProductID == id);
Assert.AreEqual("Chai", prod.ProductName);
id = 2;
prod = db.Products.Single(p => p.ProductID == id);
Assert.AreEqual("Chang", prod.ProductName);
}
[Test]
public void A5_SelectSingleOrDefault()
{
Northwind db = CreateDB();
// Query for a specific customer
var cust = db.Customers.SingleOrDefault(c => c.CompanyName == "Around the Horn");
Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");
#if false
var id = "ALFKI";
cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
Assert.AreEqual("ALFKI", cust.CustomerID);
id = "BLAUS";
cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
Assert.AreEqual("BLAUS", cust.CustomerID);
id = "DNE";
cust = db.Customers.SingleOrDefault(c => c.CustomerID == id); // Does Not Exist
Assert.IsNull(cust);
id = "ALFKI";
cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
Assert.AreEqual("ALFKI", cust.CustomerID);
id = "BLAUS";
cust = db.Customers.SingleOrDefault(c => c.CustomerID == id);
#endif
cust = GetCustomerById(db, "ALFKI");
Assert.AreEqual("ALFKI", cust.CustomerID);
cust = GetCustomerById(db, "BLAUS");
Assert.AreEqual("BLAUS", cust.CustomerID);
cust = GetCustomerById(db, "DNE");
Assert.IsNull(cust);
cust = GetCustomerById(db, "ALFKI");
Assert.AreEqual("ALFKI", cust.CustomerID);
cust = GetCustomerById(db, "BLAUS");
Assert.AreEqual("BLAUS", cust.CustomerID);
}
private static Customer GetCustomerById(Northwind db, string id)
{
return db.Customers.SingleOrDefault(c => c.CustomerID == id);
}
[Test]
public void A6_ConnectionOpenTest()
{
Northwind db = CreateDB(System.Data.ConnectionState.Open);
Product p1 = db.Products.Single(p => p.ProductID == 1);
Assert.IsTrue(p1.ProductID == 1);
}
[Test]
public void A7_ConnectionClosedTest()
{
Northwind db = CreateDB(System.Data.ConnectionState.Closed);
Product p1 = db.Products.Single(p => p.ProductID == 1);
Assert.IsTrue(p1.ProductID == 1);
}
[Test]
public void A8_SelectSingleOrDefault_QueryCacheDisabled()
{
Northwind db = CreateDB();
#if !MONO_STRICT
db.QueryCacheEnabled = true;
#endif
// Query for a specific customer
var cust = db.Customers.SingleOrDefault(c => c.CompanyName == "Around the Horn");
Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'.");
cust = GetCustomerById(db, "ALFKI");
Assert.AreEqual("ALFKI", cust.CustomerID);
cust = GetCustomerById(db, "BLAUS");
Assert.AreEqual("BLAUS", cust.CustomerID);
cust = GetCustomerById(db, "DNE");
Assert.IsNull(cust);
cust = GetCustomerById(db, "ALFKI");
Assert.AreEqual("ALFKI", cust.CustomerID);
cust = GetCustomerById(db, "BLAUS");
Assert.AreEqual("BLAUS", cust.CustomerID);
}
#endregion
//TODO: group B, which checks AllTypes
#region Tests 'C' do plain select - no aggregation
[Test]
public void C1_SelectProducts()
{
Northwind db = CreateDB();
var q = from p in db.Products select p;
List products = q.ToList();
int productCount = products.Count;
Assert.Greater(productCount, 0, "Expected some products, got none");
}
#if !DEBUG && SQLITE
[Explicit]
#endif
[Test]
public void C2_SelectPenId()
{
Northwind db = CreateDB();
var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;
var productIDs = q.ToList();
int productCount = productIDs.Count;
Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount);
}
[Test]
public void C2b_SelectPenId()
{
Northwind db = CreateDB();
var pen = "Chai";
var q = from p in db.Products where p.ProductName == pen select p.ProductID;
var productIDs = q.ToList();
int productCount = productIDs.Count;
Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount);
}
[Test]
public void C3_SelectPenIdName()
{
Northwind db = CreateDB();
var q = from p in db.Products
where p.ProductName == "Chai"
select new { ProductId = p.ProductID, Name = p.ProductName };
int count = 0;
//string penName;
foreach (var v in q)
{
Assert.AreEqual(v.Name, "Chai", "Expected ProductName='Chai'");
count++;
}
Assert.AreEqual(count, 1, "Expected one pen, got count=" + count);
}
#if !DEBUG && POSTGRES
[Explicit]
#endif
[Test]
public void C4_CountWithOrderBy()
{
Northwind db = CreateDB();
var q = (from p in db.Products
orderby p.ProductID
select p).Count();
Assert.IsTrue(q > 0);
}
[Test]
public void C5_ConstantProperty()
{
Northwind db = CreateDB();
var res = from o in db.Orders
select new { test = 1 };
var list = res.ToList();
Assert.AreEqual(db.Orders.Count(), list.Count);
}
[Test]
public void C6_NullParentEmplyee()
{
//this should generate a LEFT JOIN statement, but currently does not.
Northwind db = CreateDB();
var query = from e in db.Employees
select new
{
Name = e.FirstName,
ReportsTo = e.ReportsToEmployee.FirstName
};
var list = query.ToList();
// PC patch: I get 4 results...
Assert.IsTrue(list.Count >= 3);
}
[Test]
public void C7_CaseInsensitiveSubstringSearch()
{
Northwind db = CreateDB();
string search = "HERKKU";
var query = db.Customers.Where(d => d.CompanyName.ToUpper()
.Contains(search));
var list = query.ToList();
Assert.AreEqual(1, list.Count);
}
///
/// from http://www.agilior.pt/blogs/pedro.rainho/archive/2008/04/11/4271.aspx
///
#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL))
[Explicit]
#endif
[Test(Description = "Using LIKE operator from linq query")]
public void C7B_LikeOperator()
{
Northwind db = CreateDB();
//this used to read "Like(HU%F)" but I don't think we have that company.
var query = (from c in db.Customers
where System.Data.Linq.SqlClient.SqlMethods.Like(c.CompanyName, "Alfre%")
select c).ToList();
var list = query.ToList();
Assert.AreEqual(1, list.Count);
}
[Test]
public void C8_SelectPenByLocalVariable()
{
Northwind db = CreateDB();
string pen = "Chai";
var q = from p in db.Products
where (p.ProductName == pen)
select p;
var productIDs = q.ToList();
int productCount = productIDs.Count;
Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount);
}
[Test]
public void C9_OrderByLeftJoin()
{
Northwind db = CreateDB();
var q = from p in db.Orders
orderby p.Customer.City
select p;
int count = q.ToList().Count();
int ordcount = db.Orders.Count();
Assert.AreEqual(ordcount, count);
}
[Test]
public void C10_ConstantPredicate()
{
Northwind db = CreateDB();
var q = from p in db.Customers
where true
select p;
int count = q.ToList().Count;
Assert.AreEqual(count, db.Customers.Count());
}
[Test]
public void C10b_ConstantPredicate()
{
Northwind db = CreateDB();
var q = from p in db.Customers
where false
select p;
int count = q.Count();
Assert.AreEqual(count, 0);
}
[Test]
public void C10c_ConstantPredicate()
{
Northwind db = CreateDB();
var q = from p in db.Customers
where (p.Address.StartsWith("A") && false)
select p;
int count = q.Count();
Assert.AreEqual(count, 0);
}
[Test]
public void C10d_ConstantPredicate()
{
Northwind db = CreateDB();
var q = from p in db.Customers
where (p.Address.StartsWith("A") || true)
select p;
int count = q.Count();
Assert.AreEqual(count, db.Customers.Count());
}
[Test]
public void C10e_ConstantPredicate()
{
Northwind db = CreateDB();
var q = from p in db.Customers
where (p.Address.StartsWith("A") || false)
select p;
int count = q.Count();
Assert.Less(count, db.Customers.Count());
}
[Test]
public void C10f_ConstantPredicate()
{
Northwind db = CreateDB();
var q = from p in db.Customers
where (p.Address.StartsWith("A") && true)
select p;
int count = q.Count();
Assert.Less(count, db.Customers.Count());
}
[Test]
public void C11_SelectProductsDiscontinued()
{
Northwind db = CreateDB();
var q = from p in db.Products
#if INGRES
where p.Discontinued == "Y"
#else
where p.Discontinued == true
#endif
select p.ProductID;
var productIDs = q.ToList();
int productCount = productIDs.Count;
Assert.AreEqual(productCount, 8, "Expected eight products discontinued, got count=" + productCount);
}
[Explicit]
[Test]
public void C12_SelectEmployee_MultiJoinWithWhere()
{
Northwind db = CreateDB();
var q = from t in db.Territories
join l in db.EmployeeTerritories on t.TerritoryID equals l.TerritoryID
join e in db.Employees on l.EmployeeID equals e.EmployeeID
where t.RegionID > 3
select e;
/* Note that written this way it work, but it's not always possible.
var q = from t in db.Territories.Where(t => t.RegionID > 3)
join l in db.EmployeeTerritories on t.TerritoryID equals l.TerritoryID
join e in db.Employees on l.EmployeeID equals e.EmployeeID
select e;
*/
var employeeCount = q.Count();
Assert.AreEqual(4, employeeCount, "Expected for employees, got count=" + employeeCount);
}
[Test]
[ExpectedException(ExceptionType=typeof(InvalidOperationException), ExpectedMessage="Data context options cannot be modified after results have been returned from a query.")]
public void C13_Changing_ObjectTrackingEnabled2False()
{
Northwind db = CreateDB();
var q = from t in db.Territories
select t;
var territoryCount = q.FirstOrDefault();
db.ObjectTrackingEnabled = false;
}
[Test]
[ExpectedException(ExceptionType = typeof(InvalidOperationException), ExpectedMessage = "Data context options cannot be modified after results have been returned from a query.")]
public void C14_Changing_DeferredLoadingEnabled2False()
{
Northwind db = CreateDB();
var q = from t in db.Territories
select t;
var territoryCount = q.FirstOrDefault();
db.DeferredLoadingEnabled = false;
}
[Test]
[ExpectedException(ExceptionType = typeof(InvalidOperationException), ExpectedMessage = "Object tracking is not enabled for the current data context instance.")]
public void C15_SubmitChanges_DeferredLoadingEnabled_False()
{
Northwind db = CreateDB();
db.ObjectTrackingEnabled = false;
var q = from t in db.Territories
select t;
var territoryCount = q.Count();
db.SubmitChanges();
}
[Test]
public void C16_GettingProperty_DeferredLoadingEnabled2False()
{
Northwind db = CreateDB();
db.DeferredLoadingEnabled = false;
var q = from t in db.Territories
select t;
Territory territory = q.FirstOrDefault();
Assert.IsNotNull(territory);
Assert.IsNull(territory.Region);
}
[Test]
public void C17_GettingProperty_ObjectTrackingEnabled2False()
{
Northwind db = CreateDB();
db.ObjectTrackingEnabled = false;
var q = from t in db.Territories
select t;
Territory territory = q.FirstOrDefault();
Assert.IsNotNull(territory);
Assert.IsNull(territory.Region);
}
[Test]
public void C18_GettingProperty_LazyLoaded()
{
Northwind db = CreateDB();
var q = from t in db.Territories
select t;
Territory territory = q.FirstOrDefault();
Assert.IsNotNull(territory);
Assert.IsNotNull(territory.Region);
}
[Test]
public void C19_SelectEmployee_Fluent()
{
Northwind db = CreateDB();
var q = db.GetTable()
.Join(db.GetTable(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)
.Join(db.GetTable().Where(e => e.EmployeeID > 0), l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);
var employeeCount = q.Count();
Assert.Greater(employeeCount, 0, "Expected any employees, got count=" + employeeCount);
}
///
/// Test the use of DbLinq as a QueryObject
/// http://www.martinfowler.com/eaaCatalog/queryObject.html
///
[Test]
public void C20_SelectEmployee_DbLinqAsQueryObject()
{
Northwind db = CreateDB();
IQueryable allEmployees = db.GetTable();
allEmployees = filterByNameOrSurnameContains(db, allEmployees, "an");
allEmployees = filterByTerritoryName(db, allEmployees, "Neward");
Assert.AreEqual(1, allEmployees.Count());
}
[Test]
public void C21_SelectEmployee_DbLinqAsQueryObjectWithOrderCount()
{
Northwind db = CreateDB();
IQueryable allEmployees = db.GetTable();
allEmployees = filterByOrderCountGreaterThan(db, allEmployees, 50);
allEmployees = filterByNameOrSurnameContains(db, allEmployees, "an");
allEmployees = filterByTerritoryNames(db, allEmployees, "Neward", "Boston", "Wilton");
int employeesCount = allEmployees.ToList().Count;
Assert.AreEqual(employeesCount, allEmployees.Count());
}
private IQueryable filterByOrderCountGreaterThan(Northwind db, IQueryable allEmployees, int minimumOrderNumber)
{
return from e in allEmployees.Where(e => e.Orders.Count > minimumOrderNumber) select e;
}
private IQueryable filterByNameOrSurnameContains(Northwind db, IQueryable allEmployees, string namePart)
{
return from e in allEmployees.Where(e => e.FirstName.Contains(namePart) || e.LastName.Contains(namePart)) select e;
}
private IQueryable filterByTerritoryName(Northwind db, IQueryable allEmployees, string territoryName)
{
IQueryable territoryRequired = db.GetTable().Where(t => t.TerritoryDescription == territoryName);
var q = territoryRequired
.Join(db.GetTable(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)
.Join(allEmployees, l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);
return q;
}
private IQueryable filterByTerritoryNames(Northwind db, IQueryable allEmployees, params string[] territoryNames)
{
IQueryable territoryRequired = db.GetTable().Where(t => territoryNames.Contains(t.TerritoryDescription));
var q = territoryRequired
.Join(db.GetTable(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l)
.Join(allEmployees, l => l.EmployeeID, e => e.EmployeeID, (l, e) => e);
return q;
}
[Test]
public void C22_SelectEmployee_GetCommandTextWithNoFilter()
{
Northwind db = CreateDB();
IQueryable allEmployees = db.GetTable();
var commandText = db.GetCommand(allEmployees).CommandText;
Assert.IsNotNull(commandText);
}
[Test]
public void C23_SelectEmployees()
{
Northwind db = CreateDB();
var allEmployees = db.GetTable();
int count = 0;
foreach (var emp in allEmployees)
{
++count;
}
Assert.AreEqual(9, count);
}
#if !DEBUG && (MSSQL && !L2SQL)
[Explicit]
#endif
[Test]
public void C24_SelectEmployee_DbLinqAsQueryObjectWithExceptAndImage()
{
// This fail becouse Employee contains a ndata, ndata is not comparable
// and EXCEPT make a distinct on DATA
Northwind db = CreateDB();
IQueryable allEmployees = db.GetTable();
var toExclude = filterByOrderCountGreaterThan(db, allEmployees, 50);
allEmployees = filterByNameOrSurnameContains(db, allEmployees, "a").Except(toExclude);
string commandText = db.GetCommand(allEmployees).CommandText;
int employeesCount = allEmployees.ToList().Count;
Assert.AreEqual(employeesCount, allEmployees.Count());
}
[Test]
public void C25_SelectViaInterface()
{
var db = CreateDB();
var c = MatchAddress(db.Customers, "ignoreme").FirstOrDefault();
Assert.IsNotNull(c);
var e = MatchAddress(db.Employees, "ignoreme").FirstOrDefault();
Assert.IsNotNull(e);
}
private static IEnumerable MatchAddress(IQueryable query, string searchValue)
where T : IHasAddress
{
var lookups = query.OrderByDescending(v => v.Address.Length);
return lookups;
}
#if !DEBUG && POSTGRES
[Explicit]
#endif
[Test]
public void C26_SelectWithNestedMethodCall()
{
var db = CreateDB();
var s = "param";
var q = from e in db.Employees select new
{
BackName = e.LastName + ", " + e.FirstName,
StaticName = GetStaticName(e),
InstanceName= GetInstanceName(e, s, "constant"),
Territories = e.EmployeeTerritories.ToList(),
};
var actual = q.ToList();
var expected = new[]{
new {
BackName = "Davolio, Nancy",
StaticName = "Nancy Davolio [Hired: 1992-05-01]",
InstanceName = "Nancy Davolio [Home Phone: (206) 555-9857]",
TerritoryCount = 2,
},
new {
BackName = "Fuller, Andrew",
StaticName = "Andrew Fuller [Hired: 1992-08-14]",
InstanceName = "Andrew Fuller [Home Phone: (206) 555-9482]",
TerritoryCount = 7,
},
new {
BackName = "Leverling, Janet",
StaticName = "Janet Leverling [Hired: 1992-04-01]",
InstanceName = "Janet Leverling [Home Phone: (206) 555-3412]",
TerritoryCount = 4,
},
new {
BackName = "Peacock, Margaret",
StaticName = "Margaret Peacock [Hired: 1993-05-03]",
InstanceName = "Margaret Peacock [Home Phone: (206) 555-8122]",
TerritoryCount = 3,
},
new {
BackName = "Buchanan, Steven",
StaticName = "Steven Buchanan [Hired: 1993-10-17]",
InstanceName = "Steven Buchanan [Home Phone: (71) 555-4848]",
TerritoryCount = 7,
},
new {
BackName = "Suyama, Michael",
StaticName = "Michael Suyama [Hired: 1993-10-17]",
InstanceName = "Michael Suyama [Home Phone: (71) 555-7773]",
TerritoryCount = 5,
},
new {
BackName = "King, Robert",
StaticName = "Robert King [Hired: 1994-01-02]",
InstanceName = "Robert King [Home Phone: (71) 555-5598]",
TerritoryCount = 10,
},
new {
BackName = "Callahan, Laura",
StaticName = "Laura Callahan [Hired: 1994-03-05]",
InstanceName = "Laura Callahan [Home Phone: (206) 555-1189]",
TerritoryCount = 4,
},
new {
BackName = "Dodsworth, Anne",
StaticName = "Anne Dodsworth [Hired: 1994-11-15]",
InstanceName = "Anne Dodsworth [Home Phone: (71) 555-4444]",
TerritoryCount = 7,
},
};
Assert.AreEqual(expected.Length, actual.Count);
for (int i = 0; i < expected.Length; ++i)
{
Assert.AreEqual(expected[i].BackName, actual[i].BackName);
Assert.AreEqual(expected[i].StaticName, actual[i].StaticName);
Assert.AreEqual(expected[i].InstanceName, actual[i].InstanceName);
Assert.AreEqual(expected[i].TerritoryCount, actual[i].Territories.Count);
}
}
static string GetStaticName(Employee e)
{
return e.FirstName + " " + e.LastName + " [Hired: " +
(e.HireDate.HasValue ? e.HireDate.Value.ToString("yyyy-MM-dd") : "") + "]";
}
string GetInstanceName(Employee e, string a, string b)
{
return e.FirstName + " " + e.LastName + " [Home Phone: " + e.HomePhone.ToString() + "]";
}
[Test]
public void C27_SelectEntitySet()
{
// Debugger.Break();
var db = CreateDB();
var q = from e in db.Employees
orderby e.EmployeeID
select new
{
e.Orders
};
var expectedOrderCounts = new[]{
123, // Nancy Davolio
96, // Andrew Fuller
127, // Janet Leverling
156, // Margaret Peacock
42, // Steven Buchanan
67, // Michael Suyama
72, // Robert King
104, // Laura Callahan
43, // Anne Dodsworth
};
int c = 0;
foreach (var e in q)
{
Assert.AreEqual(expectedOrderCounts[c], e.Orders.Count);
++c;
}
Assert.AreEqual(expectedOrderCounts.Length, c);
}
[Test]
public void C28_SelectEntityRef()
{
var db = CreateDB();
var emp = db.Employees.Single(e => e.EmployeeID == 1);
Assert.IsNotNull(emp.ReportsToEmployee);
Assert.AreEqual(emp.ReportsTo.Value, emp.ReportsToEmployee.EmployeeID);
}
#endregion
#region region D - select first or last - calls IQueryable.Execute instead of GetEnumerator
[Test]
public void D01_SelectFirstPenID()
{
Northwind db = CreateDB();
var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;
var productID = q.First();
Assert.Greater(productID, 0, "Expected penID>0, got " + productID);
}
///
/// Reported by pwy.mail in http://code.google.com/p/dblinq2007/issues/detail?id=67
///
[Test]
public void D01b_SelectFirstOrDefaultCustomer()
{
Northwind db = CreateDB();
var q =
from c in db.Customers
select c;
Customer customer = q.FirstOrDefault();
Assert.IsNotNull(customer.CustomerID);
}
[Test]
public void D02_SelectFirstPen()
{
Northwind db = CreateDB();
var q = from p in db.Products where p.ProductName == "Chai" select p;
Product pen = q.First();
Assert.IsNotNull(pen, "Expected non-null Product");
}
#if !DEBUG && MSSQL
// L2SQL: System.NotSupportedException : The query operator 'Last' is not supported.
[Explicit]
#endif
[Test]
public void D03_SelectLastPenID()
{
Northwind db = CreateDB();
var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID;
var productID = q.Last();
Assert.Greater(productID, 0, "Expected penID>0, got " + productID);
}
#if !DEBUG && (POSTGRES || (MSSQL && !L2SQL))
[Explicit]
#endif
[Test]
public void D04_SelectProducts_OrderByName()
{
Northwind db = CreateDB();
var q = from p in db.Products orderby p.ProductName select p;
string prevProductName = null;
foreach (Product p in q)
{
if (prevProductName == p.ProductName && p.ProductName.StartsWith("temp_"))
continue; //skip temp rows
if (prevProductName != null)
{
//int compareNames = prevProductName.CompareTo(p.ProductName);
int compareNames = string.Compare(prevProductName, p.ProductName, stringComparisonType);
Assert.Less(compareNames, 0, "When ordering by names, expected " + prevProductName + " to come after " + p.ProductName);
}
prevProductName = p.ProductName;
}
//Assert.Greater(productID,0,"Expected penID>0, got "+productID);
}
[Test]
public void D05_SelectOrdersForProduct()
{
Northwind db = CreateDB();
//var q = from p in db.Products where "Chai"==p.ProductName select p.Order;
//List penOrders = q.ToList();
//Assert.Greater(penOrders.Count,0,"Expected some orders for product 'Chai'");
var q =
from o in db.Orders
where o.Customer.City == "London"
select new { c = o.Customer, o };
var list1 = q.ToList();
foreach (var co in list1)
{
Assert.IsNotNull(co.c, "Expected non-null customer");
Assert.IsNotNull(co.c.City, "Expected non-null customer city");
Assert.IsNotNull(co.o, "Expected non-null order");
}
Assert.Greater(list1.Count, 0, "Expected some orders for London customers");
}
[Test]
public void D06_OrdersFromLondon()
{
Northwind db = CreateDB();
var q =
from o in db.Orders
where o.Customer.City == "London"
select new { c = o.Customer, o };
var list1 = q.ToList();
foreach (var co in list1)
{
Assert.IsNotNull(co.c, "Expected non-null customer");
Assert.IsNotNull(co.o, "Expected non-null order");
}
Assert.Greater(list1.Count, 0, "Expected some orders for London customers");
}
[Test]
public void D07_OrdersFromLondon_Alt()
{
//this is a "SelectMany" query:
Northwind db = CreateDB();
var q =
from c in db.Customers
from o in c.Orders
where c.City == "London"
select new { c, o };
Assert.Greater(q.ToList().Count, 0, "Expected some orders for London customers");
}
[Test]
public void D08_Products_Take5()
{
Northwind db = CreateDB();
var q = (from p in db.Products select p).Take(5);
List prods = q.ToList();
Assert.AreEqual(5, prods.Count, "Expected five products");
}
[Test]
public void D09_Products_LetterP_Take5()
{
Northwind db = CreateDB();
//var q = (from p in db.Products where p.ProductName.Contains("p") select p).Take(5);
var q = db.Products.Where(p => p.ProductName.Contains("p")).Take(5);
List prods = q.ToList();
#if POSTGRES || INGRES
int expectedCount = 0; //Only 'Toilet Paper'
#else
int expectedCount = 2; //Oracle, Mysql: 'Toilet Paper' and 'iPod'
#endif
Assert.Greater(prods.Count, expectedCount, "Expected couple of products with letter 'p'");
}
[Test]
public void D10_Products_LetterP_Desc()
{
Northwind db = CreateDB();
var q = (from p in db.Products
where p.ProductName.Contains("P")
orderby p.ProductID descending
select p
).Take(5);
//var q = db.Products.Where( p=>p.ProductName.Contains("p")).Take(5);
List prods = q.ToList();
Assert.Greater(prods.Count, 2, "Expected couple of products with letter 'p'");
var prodID0 = prods[0].ProductID;
var prodID1 = prods[1].ProductID;
Assert.Greater(prodID0, prodID1, "Sorting is broken");
}
[Test]
public void D11_Products_DoubleWhere()
{
Northwind db = CreateDB();
var q1 = db.Products.Where(p => p.ProductID > 1).Where(q => q.ProductID < 10);
int count1 = q1.Count();
}
#if !DEBUG && (SQLITE || POSTGRES || MSSQL)
// L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTest+Northwind1+CustomerDerivedClass' is not mapped as a Table.
[Explicit]
#endif
[Test]
public void D12_SelectDerivedClass()
{
Northwind dbo = CreateDB();
Northwind1 db = new Northwind1(dbo.Connection);
var derivedCustomer = (from c in db.ChildCustomers
where c.City == "London"
select c).First();
Assert.IsTrue(derivedCustomer.City == "London");
}
public class Northwind1 : Northwind
{
public Northwind1(System.Data.IDbConnection connection)
: base(connection)
{ }
public class CustomerDerivedClass : Customer { }
public class CustomerDerivedClass2 : CustomerDerivedClass { }
public DataLinq.Table ChildCustomers
{
get { return base.GetTable(); }
}
}
[Test(Description = "Calls ExecuteQuery<> to store result into object type property")]
// note: for PostgreSQL requires database with lowercase names, NorthwindReqular.SQL
public void D13_ExecuteQueryObjectProperty()
{
Northwind db = CreateDB();
var res = db.ExecuteQuery(@"SELECT [ProductID] AS ChaiId FROM [Products] WHERE
[ProductName] ='Chai'").Single();
Assert.AreEqual(1, res.ChaiId);
}
class Chai
{
internal int ChaiId;
}
[Test]
public void D14_ProjectedProductList()
{
Northwind db = CreateDB();
var query = from pr in db.Products
select new
{
pr.ProductID,
pr.ProductName,
pr.Supplier, // exception!
pr.UnitPrice, // exception!
pr.UnitsInStock,
pr.UnitsOnOrder
};
//WARNING - as of 2008Apr, we return Suppliers without blowing up, but they need to be live
var list = query.ToList();
Assert.IsTrue(list.Count > 0);
foreach (var item in list)
{
Assert.IsTrue(item.Supplier != null);
}
}
#if !DEBUG && (SQLITE || POSTGRES || MSSQL)
// L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTest+NorthwindDupl+CustomerDerivedClass' is not mapped as a Table.
[Explicit]
#endif
[Test]
public void D15_DuplicateProperty()
{
Northwind dbo = CreateDB();
NorthwindDupl db = new NorthwindDupl(dbo.Connection);
var derivedCustomer = (from c in db.ChildCustomers
where c.City == "London"
select c).First();
Assert.IsTrue(derivedCustomer.City == "London");
}
public class NorthwindDupl : Northwind
{
public NorthwindDupl(System.Data.IDbConnection connection)
: base(connection)
{ }
public class CustomerDerivedClass : Customer
{
private string city;
[Column(Storage = "city", Name = "city")]
public new string City
{
get
{
return city;
}
set
{
if (value != city)
{
city = value;
}
}
}
}
public DataLinq.Table ChildCustomers
{
get { return base.GetTable(); }
}
}
///
/// DbLinq must use field and should not look to setter.
///
// PC: is this specified somewhere?
[Test]
public void D16_CustomerWithoutSetter()
{
Assert.Ignore("See if this is specified");
Northwind dbo = CreateDB();
NorthwindAbstractBaseClass db = new NorthwindAbstractBaseClass(dbo.Connection);
var Customer = (from c in db.ChildCustomers
where c.City == "London"
select c).First();
Assert.IsTrue(Customer.City == "London");
}
abstract class AbstractCustomer
{
public abstract string City { get; }
}
class NorthwindAbstractBaseClass : Northwind
{
public NorthwindAbstractBaseClass(System.Data.IDbConnection connection)
: base(connection) { }
[Table(Name = "customers")]
public class Customer : AbstractCustomer
{
string city;
[Column(Storage = "city", Name = "city")]
public override string City
{
get
{
return city;
}
}
}
[Table(Name = "customers")]
public class Customer2 : Customer { }
public DataLinq.Table ChildCustomers
{
get { return base.GetTable(); }
}
}
#endregion
[Test]
public void SqlInjectionAttack()
{
var db = CreateDB();
var q = db.Customers.Where(c => c.ContactName == "'; DROP TABLE DoesNotExist; --");
Assert.AreEqual(0, q.Count());
}
#if POSTGRES || MSSQL
[Test]
public void Storage01()
{
var db = CreateDB();
var q = db.NoStorageCategories.Where(c => c.CategoryID == 1);
var r = q.First();
Assert.AreEqual(1, q.Count());
Assert.AreEqual(1, r.CategoryID);
Assert.IsTrue(r.propertyInvoked_CategoryName);
Assert.IsFalse(r.propertyInvoked_Description);
}
#endif
}
}