Tests.cs 18.9 KB
Newer Older
S
Sam Saffron 已提交
1 2 3
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
M
mgravell 已提交
4
using System.Linq;
5
using Dapper;
6 7
using System.Data.SqlServerCe;
using System.IO;
S
Sam Saffron 已提交
8 9
using System.Data;
using System.Collections;
S
Sam Saffron 已提交
10 11 12

namespace SqlMapper
{
S
Sam Saffron 已提交
13
    static class Assert
S
Sam Saffron 已提交
14
    {
S
Sam Saffron 已提交
15

16
        public static void IsEqualTo<T>(this T obj, T other)
S
Sam Saffron 已提交
17 18 19 20 21 22 23
        {
            if (!obj.Equals(other))
            {
                throw new ApplicationException(string.Format("{0} should be equals to {1}", obj, other));
            }
        }

24
        public static void IsSequenceEqualTo<T>(this IEnumerable<T> obj, IEnumerable<T> other)
S
Sam Saffron 已提交
25
        {
S
Sam Saffron 已提交
26
            if (!obj.SequenceEqual(other))
S
Sam Saffron 已提交
27
            {
S
Sam Saffron 已提交
28
                throw new ApplicationException(string.Format("{0} should be equals to {1}", obj, other));
S
Sam Saffron 已提交
29 30 31
            }
        }

S
Sam Saffron 已提交
32
        public static void IsFalse(this bool b)
S
Sam Saffron 已提交
33
        {
S
Sam Saffron 已提交
34
            if (b)
S
Sam Saffron 已提交
35
            {
S
Sam Saffron 已提交
36
                throw new ApplicationException("Expected false");
S
Sam Saffron 已提交
37 38 39
            }
        }

40 41
        public static void IsTrue(this bool b)
        {
S
Sam Saffron 已提交
42
            if (!b)
43 44 45 46 47
            {
                throw new ApplicationException("Expected true");
            }
        }

S
Sam Saffron 已提交
48 49 50 51 52 53 54
        public static void IsNull(this object obj)
        {
            if (obj != null)
            {
                throw new ApplicationException("Expected null");
            }
        }
S
Sam Saffron 已提交
55

S
Sam Saffron 已提交
56 57 58 59 60
    }

    class Tests
    {
       
S
Sam Saffron 已提交
61 62 63 64
        SqlConnection connection = Program.GetOpenConnection();

        public void SelectListInt()
        {
65
            connection.Query<int>("select 1 union all select 2 union all select 3")
66
              .IsSequenceEqualTo(new[] { 1, 2, 3 });
S
Sam Saffron 已提交
67 68 69 70
        }

        public void PassInIntArray()
        {
71
            connection.Query<int>("select * from (select 1 as Id union all select 2 union all select 3) as X where Id in @Ids", new { Ids = new int[] { 1, 2, 3 }.AsEnumerable() })
72
             .IsSequenceEqualTo(new[] { 1, 2, 3 });
S
Sam Saffron 已提交
73
        }
S
Sam Saffron 已提交
74

S
Sam Saffron 已提交
75 76 77

        public void TestDoubleParam()
        {
78
            connection.Query<double>("select @d", new { d = 0.1d }).First()
79
                .IsEqualTo(0.1d);
S
Sam Saffron 已提交
80 81 82 83
        }

        public void TestBoolParam()
        {
84
            connection.Query<bool>("select @b", new { b = false }).First()
S
Sam Saffron 已提交
85
                .IsFalse();
S
Sam Saffron 已提交
86 87 88 89
        }

        public void TestStrings()
        {
90
            connection.Query<string>(@"select 'a' a union select 'b'")
91
                .IsSequenceEqualTo(new[] { "a", "b" });
S
Sam Saffron 已提交
92 93
        }

S
Sam Saffron 已提交
94 95 96 97 98 99 100 101 102 103
        public class Dog
        {
            public int? Age { get; set; }
            public Guid Id { get; set; }
            public string Name { get; set; }
            public float? Weight { get; set; }

            public int IgnoredProperty { get { return 1; } }
        }

104 105 106
        public void TestExtraFields()
        {
            var guid = Guid.NewGuid();
107
            var dog = connection.Query<Dog>("select '' as Extra, 1 as Age, 0.1 as Name1 , Id = @id", new { Id = guid});
108 109 110 111 112 113 114 115 116 117 118 119

            dog.Count()
               .IsEqualTo(1);

            dog.First().Age
                .IsEqualTo(1);

            dog.First().Id
                .IsEqualTo(guid);
        }


120
        public void TestStrongType()
S
Sam Saffron 已提交
121
        {
122
            var guid = Guid.NewGuid();
123
            var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });
S
Sam Saffron 已提交
124 125
            
            dog.Count()
126
                .IsEqualTo(1);
S
Sam Saffron 已提交
127 128 129

            dog.First().Age
                .IsNull();
130 131

            dog.First().Id
132
                .IsEqualTo(guid);
S
Sam Saffron 已提交
133 134
        }

S
Sam Saffron 已提交
135 136
        public void TestSimpleNull()
        {
137
            connection.Query<DateTime?>("select null").First().IsNull();
S
Sam Saffron 已提交
138
        }
139

S
Sam Saffron 已提交
140 141
        public void TestExpando()
        {
142 143
            var rows = connection.Query("select 1 A, 2 B union all select 3, 4").ToList();
            
S
Sam Saffron 已提交
144
            ((int)rows[0].A)
145
                .IsEqualTo(1);
S
Sam Saffron 已提交
146 147

            ((int)rows[0].B)
148
                .IsEqualTo(2);
S
Sam Saffron 已提交
149 150

            ((int)rows[1].A)
151
                .IsEqualTo(3);
S
Sam Saffron 已提交
152 153

            ((int)rows[1].B)
154
                .IsEqualTo(4);
S
Sam Saffron 已提交
155
        }
S
Sam Saffron 已提交
156 157

        public void TestStringList()
S
Sam Saffron 已提交
158
        {
159
            connection.Query<string>("select * from (select 'a' as x union all select 'b' union all select 'c') as T where x in @strings", new {strings = new[] {"a","b","c"}})
160
                .IsSequenceEqualTo(new[] {"a","b","c"});
S
Sam Saffron 已提交
161 162 163

             connection.Query<string>("select * from (select 'a' as x union all select 'b' union all select 'c') as T where x in @strings", new { strings = new string[0] })
	                .IsSequenceEqualTo(new string[0]);
S
Sam Saffron 已提交
164 165
        }

S
Sam Saffron 已提交
166 167
        public void TestExecuteCommand()
        {
168
            connection.Execute(@"
S
Sam Saffron 已提交
169 170 171 172 173 174
    set nocount on 
    create table #t(i int) 
    set nocount off 
    insert #t 
    select @a a union all select @b 
    set nocount on 
175
    drop table #t", new {a=1, b=2 }).IsEqualTo(2);
S
Sam Saffron 已提交
176 177
        }

S
Sam Saffron 已提交
178 179 180
        public void TestMassiveStrings()
        { 
            var str = new string('X', 20000);
181
            connection.Query<string>("select @a", new { a = str }).First()
182
                .IsEqualTo(str);
S
Sam Saffron 已提交
183 184
        }

185 186 187 188 189 190 191 192 193 194 195
        class TestObj
        {
            public int _internal;
            internal int Internal { set { _internal = value; } }

            public int _priv;
            internal int Priv { set { _priv = value; } }
        }

        public void TestSetInternal()
        {
196
            connection.Query<TestObj>("select 10 as [Internal]").First()._internal.IsEqualTo(10);
197 198 199 200
        }

        public void TestSetPrivate()
        {
201
            connection.Query<TestObj>("select 10 as [Priv]").First()._priv.IsEqualTo(10);
202 203
        }

204 205
        public void TestEnumeration()
        {
S
Sam Saffron 已提交
206 207 208 209
            var en = connection.Query<int>("select 1 as one union all select 2 as one", buffered: false);
            var i = en.GetEnumerator();
            i.MoveNext();

210 211 212
            bool gotException = false;
            try
            {
S
Sam Saffron 已提交
213
                var x = connection.Query<int>("select 1 as one", buffered: false).First();
214 215 216 217 218 219
            }
            catch (Exception)
            {
                gotException = true;
            }

S
Sam Saffron 已提交
220 221
            while (i.MoveNext())
            { }
222 223

            // should not exception, since enumertated
224
            en = connection.Query<int>("select 1 as one", buffered: false);
225 226 227 228 229 230

            gotException.IsTrue();
        }

        public void TestEnumerationDynamic()
        {
S
Sam Saffron 已提交
231 232 233 234
            var en = connection.Query("select 1 as one union all select 2 as one", buffered: false);
            var i = en.GetEnumerator();
            i.MoveNext();

235 236 237
            bool gotException = false;
            try
            {
S
Sam Saffron 已提交
238
                var x = connection.Query("select 1 as one", buffered: false).First();
239 240 241 242 243 244
            }
            catch (Exception)
            {
                gotException = true;
            }

S
Sam Saffron 已提交
245 246
            while (i.MoveNext())
            { }
247 248

            // should not exception, since enumertated
S
Sam Saffron 已提交
249
            en = connection.Query("select 1 as one", buffered: false);
250 251 252

            gotException.IsTrue();
        }
253

S
Sam Saffron 已提交
254 255 256 257 258 259 260 261 262 263 264 265 266 267

        class User 
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
        class Post 
        {
            public int Id { get; set; }
            public User Owner { get; set; }
            public string Content { get; set; }
        }
        public void TestMultiMap()
        {
S
Sam Saffron 已提交
268 269 270
            var createSql = @"
                create table #Users (Id int, Name varchar(20))
                create table #Posts (Id int, OwnerId int, Content varchar(20))
S
Sam Saffron 已提交
271

S
style  
Sam Saffron 已提交
272
                insert #Users values(99, 'Sam')
S
Sam Saffron 已提交
273 274
                insert #Users values(2, 'I am')

S
style  
Sam Saffron 已提交
275 276
                insert #Posts values(1, 99, 'Sams Post1')
                insert #Posts values(2, 99, 'Sams Post2')
S
Sam Saffron 已提交
277 278 279 280
                insert #Posts values(3, null, 'no ones post')
";
            connection.Execute(createSql);

S
style  
Sam Saffron 已提交
281 282 283 284 285
            var sql = 
@"select * from #Posts p 
left join #Users u on u.Id = p.OwnerId 
Order by p.Id";

286
            var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post; }).ToList();
S
style  
Sam Saffron 已提交
287 288 289 290 291 292
            var p = data.First();
           
            p.Content.IsEqualTo("Sams Post1");
            p.Id.IsEqualTo(1);
            p.Owner.Name.IsEqualTo("Sam");
            p.Owner.Id.IsEqualTo(99);
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319

            data[2].Owner.IsNull();

            connection.Execute("drop table #Users drop table #Posts");
        }


        public void TestMultiMapDynamic()
        {
            var createSql = @"
                create table #Users (Id int, Name varchar(20))
                create table #Posts (Id int, OwnerId int, Content varchar(20))

                insert #Users values(99, 'Sam')
                insert #Users values(2, 'I am')

                insert #Posts values(1, 99, 'Sams Post1')
                insert #Posts values(2, 99, 'Sams Post2')
                insert #Posts values(3, null, 'no ones post')
";
            connection.Execute(createSql);

            var sql =
@"select * from #Posts p 
left join #Users u on u.Id = p.OwnerId 
Order by p.Id";

320
            var data = connection.Query<dynamic, dynamic, dynamic>(sql, (post, user) => { post.Owner = user; return post; }).ToList();
321 322 323 324 325 326 327 328 329 330 331
            var p = data.First();

            // hairy extension method support for dynamics
            ((string)p.Content).IsEqualTo("Sams Post1");
            ((int)p.Id).IsEqualTo(1);
            ((string)p.Owner.Name).IsEqualTo("Sam");
            ((int)p.Owner.Id).IsEqualTo(99);

            ((object)data[2].Owner).IsNull();

            connection.Execute("drop table #Users drop table #Posts");
S
Sam Saffron 已提交
332
        }
333

M
mgravell 已提交
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
        public void TestFieldsAndPrivates()
        {
            var data = connection.Query<TestFieldCaseAndPrivatesEntity>(
                @"select a=1,b=2,c=3,d=4,f='5'").Single();

            
            data.a.IsEqualTo(1);
            data.GetB().IsEqualTo(2);
            data.c.IsEqualTo(3);
            data.GetD().IsEqualTo(4);
            data.e.IsEqualTo(5);


        }

        private class TestFieldCaseAndPrivatesEntity
        {
            public int a { get; set; }
            private int b { get; set; }
            public int GetB() { return b; }
            public int c = 0;
            private int d = 0;
            public int GetD() { return d; }
            public int e { get; set; }
            private string f
            {
                get { return e.ToString(); }
                set { e = int.Parse(value); }
            }
        }
M
mgravell 已提交
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379

        public void TestMultiReaderBasic()
        {
            var sql = @"select 1 as Id union all select 2 as Id     select 'abc' as name   select 1 as Id union all select 2 as Id";
            int i, j;
            string s;
            using (var multi = connection.QueryMultiple(sql))
            {
                i = multi.Read<int>().First();
                s = multi.Read<string>().Single();
                j = multi.Read<int>().Sum();
            }
            Assert.IsEqualTo(i, 1);
            Assert.IsEqualTo(s, "abc");
            Assert.IsEqualTo(j, 3);
        }
S
Sam Saffron 已提交
380 381
        public void TestMultiMappingVariations()
        {
S
Sam Saffron 已提交
382
            var sql = @"select 1 as Id, 'a' as Content, 2 as Id, 'b' as Content, 3 as Id, 'c' as Content, 4 as Id, 'd' as Content, 5 as Id, 'e' as Content";
383 384

            var order = connection.Query<dynamic, dynamic, dynamic, dynamic>(sql, (o, owner, creator) => { o.Owner = owner; o.Creator = creator; return o; }).First();
S
Sam Saffron 已提交
385 386 387 388 389 390 391 392

            Assert.IsEqualTo(order.Id, 1);
            Assert.IsEqualTo(order.Content, "a");
            Assert.IsEqualTo(order.Owner.Id, 2);
            Assert.IsEqualTo(order.Owner.Content, "b");
            Assert.IsEqualTo(order.Creator.Id, 3);
            Assert.IsEqualTo(order.Creator.Content, "c");

393
            order = connection.Query<dynamic, dynamic, dynamic, dynamic, dynamic>(sql, (o, owner, creator, address) => 
S
Sam Saffron 已提交
394 395 396 397
                { 
                  o.Owner = owner; 
                  o.Creator = creator; 
                  o.Owner.Address = address;
398
                  return o;
S
Sam Saffron 已提交
399 400 401 402 403 404 405 406 407 408 409
                }).First();

            Assert.IsEqualTo(order.Id, 1);
            Assert.IsEqualTo(order.Content, "a");
            Assert.IsEqualTo(order.Owner.Id, 2);
            Assert.IsEqualTo(order.Owner.Content, "b");
            Assert.IsEqualTo(order.Creator.Id, 3);
            Assert.IsEqualTo(order.Creator.Content, "c");
            Assert.IsEqualTo(order.Owner.Address.Id, 4);
            Assert.IsEqualTo(order.Owner.Address.Content, "d");

410
            order = connection.Query<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>(sql, (a, b, c, d, e) => { a.B = b; a.C = c; a.C.D = d; a.E = e; return a; }).First();
S
Sam Saffron 已提交
411 412 413 414 415 416 417 418 419 420 421

            Assert.IsEqualTo(order.Id, 1);
            Assert.IsEqualTo(order.Content, "a");
            Assert.IsEqualTo(order.B.Id, 2);
            Assert.IsEqualTo(order.B.Content, "b");
            Assert.IsEqualTo(order.C.Id, 3);
            Assert.IsEqualTo(order.C.Content, "c");
            Assert.IsEqualTo(order.C.D.Id, 4);
            Assert.IsEqualTo(order.C.D.Content, "d");
            Assert.IsEqualTo(order.E.Id, 5);
            Assert.IsEqualTo(order.E.Content, "e");
S
Sam Saffron 已提交
422 423 424

        }

425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
        class InheritanceTest1
        {
            public string Base1 { get; set; }
            public string Base2 { get; private set; }
        }

        class InheritanceTest2 : InheritanceTest1
        {
            public string Derived1 { get; set; }
            public string Derived2 { get; private set; }
        }

        public void TestInheritance()
        {
            // Test that inheritance works.
            var list = connection.Query<InheritanceTest2>("select 'One' as Derived1, 'Two' as Derived2, 'Three' as Base1, 'Four' as Base2");
            list.First().Derived1.IsEqualTo("One");
            list.First().Derived2.IsEqualTo("Two");
            list.First().Base1.IsEqualTo("Three");
            list.First().Base2.IsEqualTo("Four");
        }

447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482

        public class PostCE
        {
            public int ID { get; set; }
            public string Title { get; set; }
            public string Body { get; set; }

            public AuthorCE Author { get; set; }
        }

        public class AuthorCE
        {
            public int ID { get; set; }
            public string Name { get; set; }
        }

        public void MultiRSSqlCE()
        {
            if (File.Exists("Test.sdf"))
                File.Delete("Test.sdf");

            var cnnStr = "Data Source = Test.sdf;";
            var engine = new SqlCeEngine(cnnStr);
            engine.CreateDatabase();
            
            using (var cnn = new SqlCeConnection(cnnStr))
            {
                cnn.Open();

                cnn.Execute("create table Posts (ID int, Title nvarchar(50), Body nvarchar(50), AuthorID int)");
                cnn.Execute("create table Authors (ID int, Name nvarchar(50))");

                cnn.Execute("insert Posts values (1,'title','body',1)");
                cnn.Execute("insert Posts values(2,'title2','body2',null)");
                cnn.Execute("insert Authors values(1,'sam')");

483
                var data = cnn.Query<PostCE, AuthorCE, PostCE>(@"select * from Posts p left join Authors a on a.ID = p.AuthorID", (post, author) => { post.Author = author; return post; }).ToList();
484
                var firstPost = data.First();
S
Sam Saffron 已提交
485 486 487
                firstPost.Title.IsEqualTo("title");
                firstPost.Author.Name.IsEqualTo("sam");
                data[1].Author.IsNull();
488 489 490
                cnn.Close();
            }
        }
S
Sam Saffron 已提交
491 492 493 494 495 496 497 498 499

        enum TestEnum : byte
        { 
           Bla = 1 
        }
        class TestEnumClass
        {
            public TestEnum? EnumEnum { get; set; }
        }
S
Sam Saffron 已提交
500
        public void TestEnumWeirdness()
S
Sam Saffron 已提交
501 502
        {
            connection.Query<TestEnumClass>("select null as [EnumEnum]");
S
Sam Saffron 已提交
503
            connection.Query<TestEnumClass>("select cast(1 as tinyint) as [EnumEnum]");
S
Sam Saffron 已提交
504 505
        }

S
Sam Saffron 已提交
506 507 508 509 510 511 512 513
        public void TestSupportForParamDictionary()
        {
            var p = new DynamicParameters();
            p.Add("@name", "bob");
            p.Add("@age", dbType: DbType.Int32, direction: ParameterDirection.Output);
                    
            connection.Query<string>("set @age = 11 select @name", p).First().IsEqualTo("bob");

S
Sam Saffron 已提交
514
            p.Get<int>("@age").IsEqualTo(11);
S
Sam Saffron 已提交
515 516
        }

S
Sam Saffron 已提交
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540

        public void TestProcSupport()
        {
            var p = new DynamicParameters();
            p.Add("@a", 11);
            p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
            p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

            connection.Execute(@"create proc #TestProc 
	@a int,
	@b int output
as 
begin
	set @b = 999
	select 1111
	return @a
end");
            connection.Query<int>("#TestProc", p, commandType: CommandType.StoredProcedure).First().IsEqualTo(1111);

            p.Get<int>("@c").IsEqualTo(11);
            p.Get<int>("@b").IsEqualTo(999);

        }

S
Sam Saffron 已提交
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
        class Person
        {
            public int PersonId { get; set; }
            public string Name { get; set; }
        }

        class Address
        {
            public int AddressId { get; set; }
            public string Name { get; set; }
            public int PersonId { get; set; }
        }

        class Extra
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }

        public void TestFlexibleMultiMapping()
        {
            var sql = 
@"select 
    1 as PersonId, 'bob' as Name, 
    2 as AddressId, 'abc street' as Name, 1 as PersonId,
    3 as Id, 'fred' as Name
    ";
            var personWithAddress = connection.Query<Person, Address, Extra, Tuple<Person, Address,Extra>>
                (sql, (p,a,e) => Tuple.Create(p, a, e), splitOn: "AddressId,Id").First();

            personWithAddress.Item1.PersonId.IsEqualTo(1);
            personWithAddress.Item1.Name.IsEqualTo("bob");
            personWithAddress.Item2.AddressId.IsEqualTo(2);
            personWithAddress.Item2.Name.IsEqualTo("abc street");
            personWithAddress.Item2.PersonId.IsEqualTo(1);
            personWithAddress.Item3.Id.IsEqualTo(3);
            personWithAddress.Item3.Name.IsEqualTo("fred");

        }

S
Sam Saffron 已提交
581 582
        /* TODO:
         * 
S
Sam Saffron 已提交
583 584 585 586 587 588 589 590
        public void TestMagicParam()
        {
            // magic params allow you to pass in single params without using an anon class
            // this test fails for now, but I would like to support a single param by parsing the sql with regex and remapping. 

            var first = connection.Query("select @a as a", 1).First();
            Assert.IsEqualTo(first.a, 1);
        }
S
Sam Saffron 已提交
591
         * */
S
Sam Saffron 已提交
592

S
Sam Saffron 已提交
593 594
    }
}