@@ -2611,6 +2611,167 @@ class CommonBasicTest(private val path: DatabasePath) {
26112611 }
26122612 }
26132613
2614+ /* *
2615+ * Test for @Default annotation - CREATE SQL generation
2616+ * Verifies that createSQL property contains the DEFAULT clause
2617+ */
2618+ fun testDefaultValuesCreateSQL () {
2619+ // Test 1: Basic default values
2620+ val defaultValuesSQL = DefaultValuesTestTable .createSQL
2621+ assertEquals(true , defaultValuesSQL.contains(" CREATE TABLE default_values_test" ))
2622+ assertEquals(true , defaultValuesSQL.contains(" status TEXT NOT NULL DEFAULT 'active'" ))
2623+ assertEquals(true , defaultValuesSQL.contains(" loginCount INT NOT NULL DEFAULT 0" ))
2624+ assertEquals(true , defaultValuesSQL.contains(" isEnabled BOOLEAN NOT NULL DEFAULT 1" ))
2625+ assertEquals(true , defaultValuesSQL.contains(" createdAt TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP" ))
2626+
2627+ // Test 2: Nullable columns with default values
2628+ val defaultNullableSQL = DefaultNullableTestTable .createSQL
2629+ assertEquals(true , defaultNullableSQL.contains(" CREATE TABLE default_nullable_test" ))
2630+ assertEquals(true , defaultNullableSQL.contains(" availability TEXT DEFAULT 'In Stock'" ))
2631+ assertEquals(true , defaultNullableSQL.contains(" quantity INT DEFAULT 100" ))
2632+ assertEquals(true , defaultNullableSQL.contains(" discount DOUBLE DEFAULT 0.0" ))
2633+
2634+ // Test 3: Default values with foreign key SET_DEFAULT trigger
2635+ val defaultFKChildSQL = DefaultFKChildTable .createSQL
2636+ assertEquals(true , defaultFKChildSQL.contains(" CREATE TABLE default_fk_child" ))
2637+ assertEquals(true , defaultFKChildSQL.contains(" parentId BIGINT NOT NULL DEFAULT 0" ))
2638+ assertEquals(true , defaultFKChildSQL.contains(" FOREIGN KEY (parentId) REFERENCES default_fk_parent(id) ON DELETE SET DEFAULT" ))
2639+ }
2640+
2641+ /* *
2642+ * Test for @Default annotation - INSERT behavior
2643+ * Verifies that default values are used when columns are omitted in INSERT
2644+ * Note: SQLlin's INSERT operation always provides all column values from data classes,
2645+ * so this test verifies the schema is correctly generated with DEFAULT clauses
2646+ */
2647+ fun testDefaultValuesInsert () {
2648+ val config = DSLDBConfiguration (
2649+ name = DATABASE_NAME ,
2650+ path = path,
2651+ version = 1 ,
2652+ create = {
2653+ CREATE (DefaultValuesTestTable )
2654+ CREATE (DefaultNullableTestTable )
2655+ }
2656+ )
2657+ Database (config, true ).databaseAutoClose { database ->
2658+ // Test 1: Verify CREATE SQL contains DEFAULT clauses
2659+ val createSQL = DefaultValuesTestTable .createSQL
2660+ assertEquals(true , createSQL.contains(" DEFAULT 'active'" ))
2661+ assertEquals(true , createSQL.contains(" DEFAULT 0" ))
2662+ assertEquals(true , createSQL.contains(" DEFAULT 1" ))
2663+
2664+ // Test 2: Insert record with all fields specified
2665+ val record1 = DefaultValuesTest (
2666+ id = null ,
2667+ name = " Test User" ,
2668+ status = " active" ,
2669+ loginCount = 0 ,
2670+ isEnabled = true ,
2671+ createdAt = " 2025-12-14 00:00:00"
2672+ )
2673+ database {
2674+ DefaultValuesTestTable { table ->
2675+ table INSERT record1
2676+ }
2677+ }
2678+
2679+ // Verify insertion
2680+ lateinit var selectStatement: SelectStatement <DefaultValuesTest >
2681+ database {
2682+ selectStatement = DefaultValuesTestTable SELECT X
2683+ }
2684+ assertEquals(1 , selectStatement.getResults().size)
2685+ val result = selectStatement.getResults()[0 ]
2686+ assertEquals(" Test User" , result.name)
2687+ assertEquals(" active" , result.status)
2688+ assertEquals(0 , result.loginCount)
2689+
2690+ // Test 3: Nullable columns with default values
2691+ val nullableRecord = DefaultNullableTest (
2692+ id = null ,
2693+ name = " Product A" ,
2694+ availability = " In Stock" ,
2695+ quantity = 100 ,
2696+ discount = 0.0
2697+ )
2698+ database {
2699+ DefaultNullableTestTable { table ->
2700+ table INSERT nullableRecord
2701+ }
2702+ }
2703+
2704+ lateinit var selectNullable: SelectStatement <DefaultNullableTest >
2705+ database {
2706+ selectNullable = DefaultNullableTestTable SELECT X
2707+ }
2708+ assertEquals(1 , selectNullable.getResults().size)
2709+ assertEquals(" Product A" , selectNullable.getResults()[0 ].name)
2710+ assertEquals(" In Stock" , selectNullable.getResults()[0 ].availability)
2711+ assertEquals(100 , selectNullable.getResults()[0 ].quantity)
2712+ }
2713+ }
2714+
2715+ /* *
2716+ * Test for @Default annotation with foreign key ON_DELETE_SET_DEFAULT trigger
2717+ * Verifies that default values are correctly included in CREATE TABLE statements with foreign keys
2718+ */
2719+ @OptIn(ExperimentalDSLDatabaseAPI ::class )
2720+ fun testDefaultValuesWithForeignKey () {
2721+ val config = DSLDBConfiguration (
2722+ name = DATABASE_NAME ,
2723+ path = path,
2724+ version = 1 ,
2725+ create = {
2726+ PRAGMA_FOREIGN_KEYS (true )
2727+ CREATE (DefaultFKParentTable )
2728+ CREATE (DefaultFKChildTable )
2729+ }
2730+ )
2731+ Database (config, true ).databaseAutoClose { database ->
2732+ // Test 1: Verify CREATE SQL contains DEFAULT with foreign key
2733+ val childSQL = DefaultFKChildTable .createSQL
2734+ assertEquals(true , childSQL.contains(" parentId BIGINT NOT NULL DEFAULT 0" ))
2735+ assertEquals(true , childSQL.contains(" FOREIGN KEY" ))
2736+ assertEquals(true , childSQL.contains(" REFERENCES default_fk_parent(id)" ))
2737+ assertEquals(true , childSQL.contains(" ON DELETE SET DEFAULT" ))
2738+
2739+ // Test 2: Verify we can insert parent and child records
2740+ val parent = DefaultFKParent (id = null , name = " Test Parent" )
2741+ database {
2742+ DefaultFKParentTable { table ->
2743+ table INSERT parent
2744+ }
2745+ }
2746+
2747+ // Get parent ID
2748+ lateinit var parentSelect: SelectStatement <DefaultFKParent >
2749+ database {
2750+ parentSelect = DefaultFKParentTable SELECT X
2751+ }
2752+ val parents = parentSelect.getResults()
2753+ assertEquals(1 , parents.size)
2754+ val parentId = parents[0 ].id!!
2755+
2756+ // Test 3: Insert child record referencing parent
2757+ val child = DefaultFKChild (id = null , parentId = parentId, description = " Test Child" )
2758+ database {
2759+ DefaultFKChildTable { table ->
2760+ table INSERT child
2761+ }
2762+ }
2763+
2764+ // Verify child was inserted with correct parentId
2765+ lateinit var childSelect: SelectStatement <DefaultFKChild >
2766+ database {
2767+ childSelect = DefaultFKChildTable SELECT X
2768+ }
2769+ assertEquals(1 , childSelect.getResults().size)
2770+ assertEquals(parentId, childSelect.getResults()[0 ].parentId)
2771+ assertEquals(" Test Child" , childSelect.getResults()[0 ].description)
2772+ }
2773+ }
2774+
26142775 private fun getDefaultDBConfig (): DatabaseConfiguration =
26152776 DatabaseConfiguration (
26162777 name = DATABASE_NAME ,
0 commit comments