Tests.cs 23.2 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

75 76 77 78 79 80
        public void TestReadMultipleIntegersWithSplitOnAny()
        {
            connection.Query<int,int,int,Tuple<int,int,int>>(
                "select 1,2,3 union all select 4,5,6", Tuple.Create, splitOn: "*")
             .IsSequenceEqualTo(new[] {Tuple.Create(1,2,3), Tuple.Create(4,5,6)});
        }
S
Sam Saffron 已提交
81 82 83

        public void TestDoubleParam()
        {
84
            connection.Query<double>("select @d", new { d = 0.1d }).First()
85
                .IsEqualTo(0.1d);
S
Sam Saffron 已提交
86 87 88 89
        }

        public void TestBoolParam()
        {
90
            connection.Query<bool>("select @b", new { b = false }).First()
S
Sam Saffron 已提交
91
                .IsFalse();
S
Sam Saffron 已提交
92 93 94 95
        }

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

S
Sam Saffron 已提交
100 101 102 103 104 105 106 107 108 109
        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; } }
        }

110 111 112
        public void TestExtraFields()
        {
            var guid = Guid.NewGuid();
113
            var dog = connection.Query<Dog>("select '' as Extra, 1 as Age, 0.1 as Name1 , Id = @id", new { Id = guid});
114 115 116 117 118 119 120 121 122 123 124 125

            dog.Count()
               .IsEqualTo(1);

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

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


126
        public void TestStrongType()
S
Sam Saffron 已提交
127
        {
128
            var guid = Guid.NewGuid();
129
            var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });
S
Sam Saffron 已提交
130 131
            
            dog.Count()
132
                .IsEqualTo(1);
S
Sam Saffron 已提交
133 134 135

            dog.First().Age
                .IsNull();
136 137

            dog.First().Id
138
                .IsEqualTo(guid);
S
Sam Saffron 已提交
139 140
        }

S
Sam Saffron 已提交
141 142
        public void TestSimpleNull()
        {
143
            connection.Query<DateTime?>("select null").First().IsNull();
S
Sam Saffron 已提交
144
        }
145

S
Sam Saffron 已提交
146 147
        public void TestExpando()
        {
148 149
            var rows = connection.Query("select 1 A, 2 B union all select 3, 4").ToList();
            
S
Sam Saffron 已提交
150
            ((int)rows[0].A)
151
                .IsEqualTo(1);
S
Sam Saffron 已提交
152 153

            ((int)rows[0].B)
154
                .IsEqualTo(2);
S
Sam Saffron 已提交
155 156

            ((int)rows[1].A)
157
                .IsEqualTo(3);
S
Sam Saffron 已提交
158 159

            ((int)rows[1].B)
160
                .IsEqualTo(4);
S
Sam Saffron 已提交
161
        }
S
Sam Saffron 已提交
162 163

        public void TestStringList()
S
Sam Saffron 已提交
164
        {
165
            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"}})
166
                .IsSequenceEqualTo(new[] {"a","b","c"});
S
Sam Saffron 已提交
167 168 169

             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 已提交
170 171
        }

S
Sam Saffron 已提交
172 173
        public void TestExecuteCommand()
        {
174
            connection.Execute(@"
S
Sam Saffron 已提交
175 176 177 178 179 180
    set nocount on 
    create table #t(i int) 
    set nocount off 
    insert #t 
    select @a a union all select @b 
    set nocount on 
181
    drop table #t", new {a=1, b=2 }).IsEqualTo(2);
S
Sam Saffron 已提交
182
        }
183 184 185 186 187 188 189
        public void TestExecuteCommandWithHybridParameters()
        {
            var p = new DynamicParameters(new { a = 1, b = 2 });
            p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.Output);
            connection.Execute(@"set @c = @a + @b", p);
            p.Get<int>("@c").IsEqualTo(3);
        }
190 191 192 193 194 195 196 197 198
        public void TestExecuteMultipleCommand()
        {
            connection.Execute("create table #t(i int)");
            int tally = connection.Execute(@"insert #t (i) values(@a)", new[] { new { a = 1 }, new { a = 2 }, new { a = 3 }, new { a = 4 } });
            int sum = connection.Query<int>("select sum(i) from #t drop table #t").First();
            tally.IsEqualTo(4);
            sum.IsEqualTo(10);
        }

S
Sam Saffron 已提交
199 200 201
        public void TestMassiveStrings()
        { 
            var str = new string('X', 20000);
202
            connection.Query<string>("select @a", new { a = str }).First()
203
                .IsEqualTo(str);
S
Sam Saffron 已提交
204 205
        }

206 207 208 209 210 211 212 213 214 215 216
        class TestObj
        {
            public int _internal;
            internal int Internal { set { _internal = value; } }

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

        public void TestSetInternal()
        {
217
            connection.Query<TestObj>("select 10 as [Internal]").First()._internal.IsEqualTo(10);
218 219 220 221
        }

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

225 226
        public void TestEnumeration()
        {
S
Sam Saffron 已提交
227 228 229 230
            var en = connection.Query<int>("select 1 as one union all select 2 as one", buffered: false);
            var i = en.GetEnumerator();
            i.MoveNext();

231 232 233
            bool gotException = false;
            try
            {
S
Sam Saffron 已提交
234
                var x = connection.Query<int>("select 1 as one", buffered: false).First();
235 236 237 238 239 240
            }
            catch (Exception)
            {
                gotException = true;
            }

S
Sam Saffron 已提交
241 242
            while (i.MoveNext())
            { }
243 244

            // should not exception, since enumertated
245
            en = connection.Query<int>("select 1 as one", buffered: false);
246 247 248 249 250 251

            gotException.IsTrue();
        }

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

256 257 258
            bool gotException = false;
            try
            {
S
Sam Saffron 已提交
259
                var x = connection.Query("select 1 as one", buffered: false).First();
260 261 262 263 264 265
            }
            catch (Exception)
            {
                gotException = true;
            }

S
Sam Saffron 已提交
266 267
            while (i.MoveNext())
            { }
268 269

            // should not exception, since enumertated
S
Sam Saffron 已提交
270
            en = connection.Query("select 1 as one", buffered: false);
271 272 273

            gotException.IsTrue();
        }
274

S
Sam Saffron 已提交
275 276 277 278 279 280 281 282 283 284 285 286 287 288

        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 已提交
289 290 291
            var createSql = @"
                create table #Users (Id int, Name varchar(20))
                create table #Posts (Id int, OwnerId int, Content varchar(20))
S
Sam Saffron 已提交
292

S
style  
Sam Saffron 已提交
293
                insert #Users values(99, 'Sam')
S
Sam Saffron 已提交
294 295
                insert #Users values(2, 'I am')

S
style  
Sam Saffron 已提交
296 297
                insert #Posts values(1, 99, 'Sams Post1')
                insert #Posts values(2, 99, 'Sams Post2')
S
Sam Saffron 已提交
298 299 300 301
                insert #Posts values(3, null, 'no ones post')
";
            connection.Execute(createSql);

S
style  
Sam Saffron 已提交
302 303 304 305 306
            var sql = 
@"select * from #Posts p 
left join #Users u on u.Id = p.OwnerId 
Order by p.Id";

307
            var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post; }).ToList();
S
style  
Sam Saffron 已提交
308 309 310 311 312 313
            var p = data.First();
           
            p.Content.IsEqualTo("Sams Post1");
            p.Id.IsEqualTo(1);
            p.Owner.Name.IsEqualTo("Sam");
            p.Owner.Id.IsEqualTo(99);
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340

            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";

341
            var data = connection.Query<dynamic, dynamic, dynamic>(sql, (post, user) => { post.Owner = user; return post; }).ToList();
342 343 344 345 346 347 348 349 350 351 352
            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 已提交
353
        }
354

M
mgravell 已提交
355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
        class Product
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public Category Category { get; set; }
        }
        class Category
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
        public void TestMultiMapWithSplit() // http://stackoverflow.com/q/6056778/23354
        {
            var sql = @"select 1 as id, 'abc' as name, 2 as id, 'def' as name";
            var product = connection.Query<Product, Category, Product>(sql, (prod, cat) =>
            {
                prod.Category = cat;
                return prod;
            }).First();
            // assertions
            product.Id.IsEqualTo(1);
            product.Name.IsEqualTo("abc");
            product.Category.Id.IsEqualTo(2);
            product.Category.Name.IsEqualTo("def");
        }
M
mgravell 已提交
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
        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 已提交
410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425

        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 已提交
426 427
        public void TestMultiMappingVariations()
        {
S
Sam Saffron 已提交
428
            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";
429 430

            var order = connection.Query<dynamic, dynamic, dynamic, dynamic>(sql, (o, owner, creator) => { o.Owner = owner; o.Creator = creator; return o; }).First();
S
Sam Saffron 已提交
431 432 433 434 435 436 437 438

            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");

439
            order = connection.Query<dynamic, dynamic, dynamic, dynamic, dynamic>(sql, (o, owner, creator, address) => 
S
Sam Saffron 已提交
440 441 442 443
                { 
                  o.Owner = owner; 
                  o.Creator = creator; 
                  o.Owner.Address = address;
444
                  return o;
S
Sam Saffron 已提交
445 446 447 448 449 450 451 452 453 454 455
                }).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");

456
            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 已提交
457 458 459 460 461 462 463 464 465 466 467

            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 已提交
468 469 470

        }

471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492
        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");
        }

493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528

        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')");

529
                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();
530
                var firstPost = data.First();
S
Sam Saffron 已提交
531 532 533
                firstPost.Title.IsEqualTo("title");
                firstPost.Author.Name.IsEqualTo("sam");
                data[1].Author.IsNull();
534 535 536
                cnn.Close();
            }
        }
S
Sam Saffron 已提交
537 538 539 540 541 542 543 544 545

        enum TestEnum : byte
        { 
           Bla = 1 
        }
        class TestEnumClass
        {
            public TestEnum? EnumEnum { get; set; }
        }
M
mgravell 已提交
546 547 548 549
        class TestEnumClassNoNull
        {
            public TestEnum EnumEnum { get; set; }
        }
S
Sam Saffron 已提交
550
        public void TestEnumWeirdness()
S
Sam Saffron 已提交
551
        {
M
mgravell 已提交
552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567
            connection.Query<TestEnumClass>("select null as [EnumEnum]").First().EnumEnum.IsEqualTo(null);
            connection.Query<TestEnumClass>("select cast(1 as tinyint) as [EnumEnum]").First().EnumEnum.IsEqualTo(TestEnum.Bla);
        }
        void Foo()
        {
            string s = "Bla";
            var obj = new TestEnumClassNoNull();
            obj.EnumEnum = (TestEnum)Enum.Parse(typeof(TestEnum), s, true);
        }
        public void TestEnumStrings()
        {
            connection.Query<TestEnumClassNoNull>("select 'BLA' as [EnumEnum]").First().EnumEnum.IsEqualTo(TestEnum.Bla);
            connection.Query<TestEnumClassNoNull>("select 'bla' as [EnumEnum]").First().EnumEnum.IsEqualTo(TestEnum.Bla);

            connection.Query<TestEnumClass>("select 'BLA' as [EnumEnum]").First().EnumEnum.IsEqualTo(TestEnum.Bla);
            connection.Query<TestEnumClass>("select 'bla' as [EnumEnum]").First().EnumEnum.IsEqualTo(TestEnum.Bla);
S
Sam Saffron 已提交
568 569
        }

S
Sam Saffron 已提交
570 571 572 573 574 575 576 577
        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 已提交
578
            p.Get<int>("@age").IsEqualTo(11);
S
Sam Saffron 已提交
579 580
        }

S
Sam Saffron 已提交
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604

        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);

        }

M
mgravell 已提交
605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
        public void TestDbString()
        {
            var obj = connection.Query("select datalength(@a) as a, datalength(@b) as b, datalength(@c) as c, datalength(@d) as d, datalength(@e) as e, datalength(@f) as f",
                new
                {
                    a = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true },
                    b = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = false },
                    c = new DbString { Value = "abcde", IsFixedLength = false, Length = 10, IsAnsi = true },
                    d = new DbString { Value = "abcde", IsFixedLength = false, Length = 10, IsAnsi = false },
                    e = new DbString { Value = "abcde", IsAnsi = true },
                    f = new DbString { Value = "abcde", IsAnsi = false },
                }).First();
            ((int)obj.a).IsEqualTo(10);
            ((int)obj.b).IsEqualTo(20);
            ((int)obj.c).IsEqualTo(5);
            ((int)obj.d).IsEqualTo(10);
            ((int)obj.e).IsEqualTo(5);
            ((int)obj.f).IsEqualTo(10);
        }

S
Sam Saffron 已提交
625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664
        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");

        }

665 666 667 668 669 670 671 672

        public void TestFastExpandoSupportsIDictionary()
        {
            var row = connection.Query("select 1 A, 'two' B").First() as IDictionary<string, object>;
            row["A"].IsEqualTo(1);
            row["B"].IsEqualTo("two");
        }

S
Sam Saffron 已提交
673 674
        /* TODO:
         * 
S
Sam Saffron 已提交
675 676 677 678 679 680 681 682
        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 已提交
683
         * */
S
Sam Saffron 已提交
684

S
Sam Saffron 已提交
685 686
    }
}