public async Task When_binding_a_collation_function_to_an_opened_connection_table()
        {
            using (var conn = new SQLiteInMemoryConnection())
            {
                conn.Open();
                Func <string, string, int> compare = (one, two) => 1;
                conn.BindFunction(new SQLiteCollationFunction("FunkyCompare", compare));

                await conn.ExecuteAsync("CREATE TABLE Numbers(No TEXT NOT NULL COLLATE FunkyCompare);");

                await conn.ExecuteAsync("INSERT INTO Numbers VALUES (1), (2), (3), (4);");

                var defaultCollation = await conn.QueryAsync <string>("SELECT No FROM Numbers ORDER BY No ASC;");

                defaultCollation.ShouldBe(new[] { "4", "3", "2", "1" });
            }
        }
        public void When_changing_connection_state()
        {
            var conn = new SQLiteInMemoryConnection();

            conn.State.ShouldBe(ConnectionState.Closed);

            conn.Open();
            conn.State.ShouldBe(ConnectionState.Open);

            conn.Close();
            conn.State.ShouldBe(ConnectionState.Open);

            conn.Dispose();

            Should.Throw <ObjectDisposedException>(() => conn.State.ShouldBe(ConnectionState.Closed))
            .Message.ShouldBe("Cannot access a disposed object.\r\nObject name: 'SQLiteConnection'.");
        }
        public async Task When_binding_a_scalar_function_to_an_opened_connection()
        {
            using (var conn = new SQLiteInMemoryConnection())
            {
                string receivedArg = null;
                var    func        = new SQLiteScalarFunction("Funky", 1, args =>
                {
                    receivedArg = args[0].ToString();
                    return("bar");
                });

                conn.Open();
                conn.BindFunction(func);

                var foo = (await conn.QueryAsync <string>("SELECT \"foo\"")).First();
                foo.ShouldBe("foo");

                var bar = (await conn.QueryAsync <string>("SELECT Funky(\"foo\")")).First();
                bar.ShouldBe("bar");
                receivedArg.ShouldBe("foo");
            }
        }
        public async Task When_binding_an_aggregate_function_to_an_opened_connection()
        {
            using (var conn = new SQLiteInMemoryConnection())
            {
                conn.Open();
                await conn.ExecuteAsync("CREATE TABLE Numbers(No INTEGER NOT NULL);");

                await conn.ExecuteAsync("INSERT INTO Numbers VALUES (1), (2), (3), (4);");

                const int InitState = 0;
                Func <object[], int, object, object> step = (objects, i, state) =>
                {
                    var newNo = Convert.ToInt32(objects[0]);
                    return((int)state + newNo);
                };
                Func <object, object> final = finalState => finalState;

                conn.BindFunction(new SQLiteAggregateFunction("FunkySum", 1, InitState, step, final));

                var funkySum = await conn.ExecuteScalarAsync <long>("SELECT FunkySum(No) FROM Numbers;");

                funkySum.ShouldBe(10);
            }
        }