// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import "dart:io"; import "package:ffi/ffi.dart"; import "package:test/test.dart"; import '../lib/sqlite.dart'; void main() { final dbPath = Platform.script.resolve("test.db").path; test("sqlite integration test", () { Database d = Database(dbPath); d.execute("drop table if exists Cookies;"); d.execute(""" create table Cookies ( id integer primary key, name text not null, alternative_name text );"""); d.execute(""" insert into Cookies (id, name, alternative_name) values (1,'Chocolade chip cookie', 'Chocolade cookie'), (2,'Ginger cookie', null), (3,'Cinnamon roll', null) ;"""); Result result = d.query(""" select id, name, alternative_name, case when id=1 then 'foo' when id=2 then 42 when id=3 then null end as multi_typed_column from Cookies ;"""); for (Row r in result) { int id = r.readColumnAsInt("id"); expect(true, 1 <= id && id <= 3); String name = r.readColumnByIndex(1); expect(name, isA()); final alternativeName = r.readColumn("alternative_name") as String?; dynamic multiTypedValue = r.readColumn("multi_typed_column"); expect( true, multiTypedValue == 42 || multiTypedValue == 'foo' || multiTypedValue == null); print("$id $name $alternativeName $multiTypedValue"); } result = d.query(""" select id, name, alternative_name, case when id=1 then 'foo' when id=2 then 42 when id=3 then null end as multi_typed_column from Cookies ;"""); for (Row r in result) { int id = r.readColumnAsInt("id"); expect(true, 1 <= id && id <= 3); String name = r.readColumnByIndex(1); expect(name, isA()); final alternativeName = r.readColumn("alternative_name") as String?; dynamic multiTypedValue = r.readColumn("multi_typed_column"); expect( true, multiTypedValue == 42 || multiTypedValue == 'foo' || multiTypedValue == null); print("$id $name $alternativeName $multiTypedValue"); if (id == 2) { result.close(); break; } } try { result.iterator.moveNext(); } on SQLiteException catch (e) { print("expected exception on accessing result data after close: $e"); } try { d.query(""" select id, non_existing_column from Cookies ;"""); } on SQLiteException catch (e) { print("expected this query to fail: $e"); } d.execute("drop table Cookies;"); d.close(); }); test("concurrent db open and queries", () { Database d = Database(dbPath); Database d2 = Database(dbPath); d.execute("drop table if exists Cookies;"); d.execute(""" create table Cookies ( id integer primary key, name text not null, alternative_name text );"""); d.execute(""" insert into Cookies (id, name, alternative_name) values (1,'Chocolade chip cookie', 'Chocolade cookie'), (2,'Ginger cookie', null), (3,'Cinnamon roll', null) ;"""); Result r = d.query("select * from Cookies;"); Result r2 = d2.query("select * from Cookies;"); r.iterator..moveNext(); r2.iterator..moveNext(); r.iterator..moveNext(); Result r3 = d2.query("select * from Cookies;"); r3.iterator..moveNext(); expect(2, r.iterator.current.readColumn("id")); expect(1, r2.iterator.current.readColumn("id")); expect(1, r3.iterator.current.readColumn("id")); r.close(); r2.close(); r3.close(); d.close(); d2.close(); }); test("stress test", () { Database d = Database(dbPath); d.execute("drop table if exists Cookies;"); d.execute(""" create table Cookies ( id integer primary key, name text not null, alternative_name text );"""); int repeats = 100; for (int i = 0; i < repeats; i++) { d.execute(""" insert into Cookies (name, alternative_name) values ('Chocolade chip cookie', 'Chocolade cookie'), ('Ginger cookie', null), ('Cinnamon roll', null) ;"""); } Result r = d.query("select count(*) from Cookies;"); int count = r.first.readColumnByIndexAsInt(0); expect(count, 3 * repeats); r.close(); d.close(); }); test("Utf8 unit test", () { final String test = 'Hasta MaƱana'; final medium = test.toNativeUtf8(); expect(test, medium.toDartString()); calloc.free(medium); }); }