Skip to content

Commit 5773dd0

Browse files
Merge pull request #222 from fsprojects/Issue200
Issue 200
2 parents 1e9c37f + d28e2c1 commit 5773dd0

File tree

11 files changed

+232
-153
lines changed

11 files changed

+232
-153
lines changed

src/SqlClient.Tests/DataTablesTests.fs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type ProductCostHistory = AdventureWorks.Production.Tables.ProductCostHistory
1818
type GetRowCount = SqlCommandProvider<"SELECT COUNT(*) FROM HumanResources.Shift", ConnectionStrings.AdventureWorksNamed, SingleRow = true>
1919
type GetShiftTableData = SqlCommandProvider<"SELECT * FROM HumanResources.Shift", ConnectionStrings.AdventureWorksNamed, ResultType.DataReader>
2020
type GetArbitraryDataAsDataTable = SqlCommandProvider<"select 1 a, 2 b, 3 c, cast(null as int) d", ConnectionStrings.AdventureWorksNamed, ResultType.DataTable>
21+
2122
type DataTablesTests() =
2223

2324
do
@@ -110,7 +111,7 @@ type DataTablesTests() =
110111
t.AddRow("Spanish siesta", TimeSpan.FromHours 13., TimeSpan.FromHours 16.)
111112

112113
//remove ModifiedDate column therefore bulk insert won't send explicit NULLs to server
113-
t.Columns.Remove(t.ModifiedDateColumn)
114+
t.Columns.Remove(t.Columns.ModifiedDate)
114115

115116
let bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran)
116117
let rowsCopied = ref 0L
@@ -124,7 +125,7 @@ type DataTablesTests() =
124125
[<Fact>]
125126
member __.DEFAULTConstraintInsertViaSqlDataAdapter() =
126127
let t = new ShiftTable()
127-
Assert.True t.ModifiedDateColumn.AllowDBNull
128+
Assert.True t.Columns.ModifiedDate.AllowDBNull
128129
use conn = new SqlConnection(connectionString = adventureWorks)
129130
conn.Open()
130131
use tran = conn.BeginTransaction()
@@ -171,8 +172,8 @@ type DataTablesTests() =
171172
Assert.Equal(1, rowsUpdated)
172173

173174
use getShift = new SqlCommandProvider<"SELECT * FROM HumanResources.Shift", ConnectionStrings.AdventureWorksNamed>()
174-
let eveningShiftIinDb = getShift.Execute() |> Seq.find (fun x -> x.Name = "Evening")
175-
Assert.Equal(finishBy10, eveningShiftIinDb.EndTime)
175+
let eveningShiftInDb = getShift.Execute() |> Seq.find (fun x -> x.Name = "Evening")
176+
Assert.Equal(finishBy10, eveningShiftInDb.EndTime)
176177

177178
[<Fact>]
178179
member __.TableTypeTag() =
@@ -312,7 +313,7 @@ type DataTablesTests() =
312313

313314
[<Fact>]
314315
member __.``Can use datacolumns on SqlProgrammabilityProvider`` () =
315-
let products = AdventureWorks.Production.Tables.Product()
316+
let products = new AdventureWorks.Production.Tables.Product()
316317

317318
let product = products.NewRow()
318319
product.Name <- "foo"
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
module FSharp.Data.``The undeclared parameter 'X' is used more than once in the batch being analyzed``
2+
3+
open System
4+
open Xunit
5+
6+
[<Fact>]
7+
let Basic() =
8+
use cmd = new SqlCommandProvider<"
9+
SELECT *
10+
FROM HumanResources.Shift
11+
WHERE
12+
@time >= StartTime
13+
AND @time <= EndTime
14+
", ConnectionStrings.AdventureWorksNamed>()
15+
let actual = [ for x in cmd.Execute( TimeSpan(16, 0, 0)) -> x.Name ]
16+
Assert.Equal<_ list>([ "Evening" ], actual )
17+
18+
[<Fact>]
19+
let WithBoundDeclaration() =
20+
use cmd = new SqlCommandProvider<"
21+
DECLARE @x AS INT = 42; --make bound vars handled properly
22+
23+
SELECT *
24+
FROM HumanResources.Shift
25+
WHERE
26+
@time >= StartTime
27+
AND @time <= EndTime
28+
", ConnectionStrings.AdventureWorksNamed>()
29+
let actual = [ for x in cmd.Execute( TimeSpan(16, 0, 0)) -> x.Name ]
30+
Assert.Equal<_ list>([ "Evening" ], actual )
31+
32+
[<Fact>]
33+
let WithUnboundDeclaration() =
34+
use cmd = new SqlCommandProvider<"
35+
DECLARE @x AS INT; --make bound vars handled properly
36+
SELECT *
37+
FROM HumanResources.Shift
38+
WHERE
39+
@time >= StartTime
40+
AND @time <= EndTime
41+
", ConnectionStrings.AdventureWorksNamed>()
42+
let actual = [ for x in cmd.Execute( TimeSpan(16, 0, 0)) -> x.Name ]
43+
Assert.Equal<_ list>([ "Evening" ], actual )
44+
45+
[<Fact>]
46+
let DynamicFiltering() =
47+
use cmd = new SqlCommandProvider<"
48+
SELECT *
49+
FROM HumanResources.Shift
50+
WHERE CAST(@time AS TIME) IS NULL OR @time BETWEEN StartTime AND EndTime
51+
", ConnectionStrings.AdventureWorksNamed>()
52+
let actual = [ for x in cmd.Execute( TimeSpan(16, 0, 0)) -> x.Name ]
53+
Assert.Equal<_ list>([ "Evening" ], actual )
54+
55+

src/SqlClient.Tests/ProgrammabilityTests.fs

Lines changed: 0 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -241,75 +241,6 @@ let ResultSetAndOutParam() =
241241
Assert.Equal<_ list>([ Some "donkey" ], [ for x in result -> x.myName ] )
242242
Assert.Equal(2L, !total)
243243

244-
[<Fact>]
245-
let TVFSynonym() =
246-
let personId = 42
247-
let actual =
248-
use cmd = new AdventureWorks.HumanResources.GetContactInformation()
249-
cmd.ExecuteSingle(personId)
250-
|> Option.map(fun x -> x.FirstName, x.LastName)
251-
252-
let expected =
253-
use cmd = new GetContactInformation()
254-
cmd.ExecuteSingle(personId)
255-
|> Option.map(fun x -> x.FirstName, x.LastName)
256244

257-
Assert.Equal(expected, actual)
258-
259-
[<Fact>]
260-
let SPSynonym() =
261-
let personId = 42
262-
let actual =
263-
use cmd = new AdventureWorks.HumanResources.GetEmployeeManagers()
264-
[ for x in cmd.Execute(personId) -> sprintf "%A.%A" x.FirstName x.LastName ]
265-
266-
let expected =
267-
use cmd = new AdventureWorks.dbo.uspGetEmployeeManagers()
268-
[ for x in cmd.Execute(personId) -> sprintf "%A.%A" x.FirstName x.LastName ]
269-
270-
Assert.Equal<_ list>(expected, actual)
271-
272-
module ReturnValues =
273-
type AdventureWorks = SqlProgrammabilityProvider<ConnectionStrings.AdventureWorksNamed, UseReturnValue = true>
274-
275-
[<Fact>]
276-
let AddRef() =
277-
let cmd = new AdventureWorks.dbo.AddRef()
278-
let x, y = 12, -1
279-
let sum = ref Int32.MinValue
280-
let returnValue = ref Int32.MaxValue
281-
let rowsAffected = cmd.Execute(x, y, sum, returnValue)
282-
Assert.Equal(-1, rowsAffected)
283-
Assert.Equal(x + y, !sum)
284-
Assert.Equal(!sum, !returnValue)
285-
//tupled syntax
286-
let rowAffected2, sum2, returnValue2 = cmd.Execute(x, y)
287-
Assert.Equal(x + y, sum2)
288-
Assert.Equal(sum2, returnValue2)
289-
Assert.Equal(-1, rowAffected2)
290-
291-
type DboMyTableType = AdventureWorks.dbo.``User-Defined Table Types``.MyTableType
292-
293-
[<Fact>]
294-
let ResultSetAndOutParam() =
295-
let cmd = new AdventureWorks.dbo.HowManyRows()
296-
let p = [
297-
DboMyTableType(myId = 1)
298-
DboMyTableType(myId = 2, myName = Some "donkey")
299-
]
300-
301-
do //explicit refs
302-
let total = ref Int64.MinValue
303-
let returnValue = ref Int32.MaxValue
304-
let result = cmd.Execute(p, total, returnValue)
305-
Assert.Equal<_ list>( [ 2, Some "donkey" ], [ for x in result -> x.myId, x.myName ] )
306-
Assert.Equal(2L, !total)
307-
Assert.Equal(0, !returnValue) //default return value
308-
309-
do //tupled response syntax
310-
let result, total, returnValue = cmd.Execute(p)
311-
Assert.Equal<_ list>( [ 2, Some "donkey" ], [ for x in result -> x.myId, x.myName ] )
312-
Assert.Equal(2L, total)
313-
Assert.Equal(0, returnValue) //default return value
314245

315246

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
module FSharp.Data.SpReturnValueTests
2+
3+
open System
4+
open Xunit
5+
6+
type AdventureWorks = SqlProgrammabilityProvider<ConnectionStrings.AdventureWorksNamed, UseReturnValue = true>
7+
8+
[<Fact>]
9+
let AddRef() =
10+
let cmd = new AdventureWorks.dbo.AddRef()
11+
let x, y = 12, -1
12+
let sum = ref Int32.MinValue
13+
let returnValue = ref Int32.MaxValue
14+
let rowsAffected = cmd.Execute(x, y, sum, returnValue)
15+
Assert.Equal(-1, rowsAffected)
16+
Assert.Equal(x + y, !sum)
17+
Assert.Equal(!sum, !returnValue)
18+
//tupled syntax
19+
let rowAffected2, sum2, returnValue2 = cmd.Execute(x, y)
20+
Assert.Equal(x + y, sum2)
21+
Assert.Equal(sum2, returnValue2)
22+
Assert.Equal(-1, rowAffected2)
23+
24+
type DboMyTableType = AdventureWorks.dbo.``User-Defined Table Types``.MyTableType
25+
26+
[<Fact>]
27+
let ResultSetAndOutParam() =
28+
let cmd = new AdventureWorks.dbo.HowManyRows()
29+
let p = [
30+
DboMyTableType(myId = 1)
31+
DboMyTableType(myId = 2, myName = Some "donkey")
32+
]
33+
34+
do //explicit refs
35+
let total = ref Int64.MinValue
36+
let returnValue = ref Int32.MaxValue
37+
let result = cmd.Execute(p, total, returnValue)
38+
Assert.Equal<_ list>( [ 2, Some "donkey" ], [ for x in result -> x.myId, x.myName ] )
39+
Assert.Equal(2L, !total)
40+
Assert.Equal(0, !returnValue) //default return value
41+
42+
do //tupled response syntax
43+
let result, total, returnValue = cmd.Execute(p)
44+
Assert.Equal<_ list>( [ 2, Some "donkey" ], [ for x in result -> x.myId, x.myName ] )
45+
Assert.Equal(2L, total)
46+
Assert.Equal(0, returnValue) //default return value

src/SqlClient.Tests/SqlClient.Tests.fsproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,17 @@
6969
<Compile Include="ConfigurationTest.fs" />
7070
<Compile Include="OptionalParamsTests.fs" />
7171
<Compile Include="TypeProviderTest.fs" />
72+
<Compile Include="FreeVarDoubleDeclTests.fs" />
7273
<Compile Include="SpatialTypesTests.fs" />
7374
<Compile Include="TransactionTests.fs" />
7475
<Compile Include="ResultTypeTests.fs" />
7576
<Compile Include="TVPTests.fs" />
7677
<Compile Include="ProgrammabilityTests.fs" />
78+
<Compile Include="SpReturnValueTests.fs" />
7779
<Compile Include="DynamicRecordTests.fs" />
7880
<Compile Include="SqlEnumTests.fs" />
7981
<Compile Include="DataTablesTests.fs" />
82+
<Compile Include="SynonymsTests.fs" />
8083
<Compile Include="CreateCommand.fs" />
8184
<None Include="sampleCommand.sql" />
8285
<None Include="extensions.sql" />
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
module FSharp.Data.SynonymsTests
2+
3+
open System
4+
open System.Data
5+
open System.Data.SqlClient
6+
open ProgrammabilityTest
7+
open Xunit
8+
9+
type AdventureWorks = ProgrammabilityTest.AdventureWorks
10+
11+
[<Fact>]
12+
let TVFSynonym() =
13+
let personId = 42
14+
let actual =
15+
use cmd = new AdventureWorks.HumanResources.GetContactInformation()
16+
cmd.ExecuteSingle(personId)
17+
|> Option.map(fun x -> x.FirstName, x.LastName)
18+
19+
let expected =
20+
use cmd = new ProgrammabilityTest.GetContactInformation()
21+
cmd.ExecuteSingle(personId)
22+
|> Option.map(fun x -> x.FirstName, x.LastName)
23+
24+
Assert.Equal(expected, actual)
25+
26+
[<Fact>]
27+
let SPSynonym() =
28+
let personId = 42
29+
let actual =
30+
use cmd = new AdventureWorks.HumanResources.GetEmployeeManagers()
31+
[ for x in cmd.Execute(personId) -> sprintf "%A.%A" x.FirstName x.LastName ]
32+
33+
let expected =
34+
use cmd = new AdventureWorks.dbo.uspGetEmployeeManagers()
35+
[ for x in cmd.Execute(personId) -> sprintf "%A.%A" x.FirstName x.LastName ]
36+
37+
Assert.Equal<_ list>(expected, actual)
38+
39+
40+
[<Fact>]
41+
let TableSynonym() =
42+
let adventureWorks = FSharp.Configuration.AppSettings<"app.config">.ConnectionStrings.AdventureWorks
43+
use conn = new SqlConnection(connectionString = adventureWorks)
44+
conn.Open()
45+
use tran = conn.BeginTransaction()
46+
47+
use cmd = new GetRowCount(transaction = tran)
48+
Assert.Equal(Some( Some 3), cmd.Execute())
49+
50+
let t = new AdventureWorks.dbo.Tables.HRShift()
51+
let row = t.NewRow()
52+
row.Name <- "French coffee break"
53+
row.StartTime <- TimeSpan.FromHours 10.
54+
row.EndTime <- TimeSpan.FromHours 12.
55+
t.Rows.Add row
56+
let rowsInserted = t.Update(conn, tran)
57+
Assert.Equal(1, rowsInserted)
58+
59+
Assert.Equal(Some( Some 4), cmd.Execute())
60+

src/SqlClient.Tests/TypeProviderTest.fs

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -313,52 +313,3 @@ let ResultsetRuntimeVerificationDiffColumnTypes() =
313313
err.Message
314314
)
315315

316-
module ``The undeclared parameter 'X' is used more than once in the batch being analyzed`` =
317-
[<Fact>]
318-
let Basic() =
319-
use cmd = new SqlCommandProvider<"
320-
SELECT *
321-
FROM HumanResources.Shift
322-
WHERE
323-
@time >= StartTime
324-
AND @time <= EndTime
325-
", ConnectionStrings.AdventureWorksNamed>()
326-
let actual = [ for x in cmd.Execute( TimeSpan(16, 0, 0)) -> x.Name ]
327-
Assert.Equal<_ list>([ "Evening" ], actual )
328-
329-
[<Fact>]
330-
let WithBoundDeclaration() =
331-
use cmd = new SqlCommandProvider<"
332-
DECLARE @x AS INT = 42; --make bound vars handled properly
333-
334-
SELECT *
335-
FROM HumanResources.Shift
336-
WHERE
337-
@time >= StartTime
338-
AND @time <= EndTime
339-
", ConnectionStrings.AdventureWorksNamed>()
340-
let actual = [ for x in cmd.Execute( TimeSpan(16, 0, 0)) -> x.Name ]
341-
Assert.Equal<_ list>([ "Evening" ], actual )
342-
343-
[<Fact>]
344-
let WithUnboundDeclaration() =
345-
use cmd = new SqlCommandProvider<"
346-
DECLARE @x AS INT; --make bound vars handled properly
347-
SELECT *
348-
FROM HumanResources.Shift
349-
WHERE
350-
@time >= StartTime
351-
AND @time <= EndTime
352-
", ConnectionStrings.AdventureWorksNamed>()
353-
let actual = [ for x in cmd.Execute( TimeSpan(16, 0, 0)) -> x.Name ]
354-
Assert.Equal<_ list>([ "Evening" ], actual )
355-
356-
[<Fact>]
357-
let DynamicFiltering() =
358-
use cmd = new SqlCommandProvider<"
359-
SELECT *
360-
FROM HumanResources.Shift
361-
WHERE CAST(@time AS TIME) IS NULL OR @time BETWEEN StartTime AND EndTime
362-
", ConnectionStrings.AdventureWorksNamed>()
363-
let actual = [ for x in cmd.Execute( TimeSpan(16, 0, 0)) -> x.Name ]
364-
Assert.Equal<_ list>([ "Evening" ], actual )

0 commit comments

Comments
 (0)