/*
 * test_transaction.cj - 事务管理测试
 */

package tybb2026::tycj_orm

import std.unittest.*

// ============================================================================
// 事务定义测试
// ============================================================================

@test
func testTransactionDefinitionDefaultValues(): Unit {
    let def = TransactionDefinition()

    assert(def.propagation == Propagation.Required)
    assert(def.isolation == IsolationLevel.Default)
    assert(def.timeout == -1)
    assert(def.readOnly == false)
}

// ============================================================================
// 事务状态测试
// ============================================================================

@test
func testNewTransaction(): Unit {
    let status = DefaultTransactionStatus(newTransaction: true)

    assert(status.isNewTransaction())
    assert(!status.isRollbackOnly())
    assert(!status.isCompleted())
}

@test
func testSetRollbackOnly(): Unit {
    let status = DefaultTransactionStatus(newTransaction: true)

    status.setRollbackOnly()

    assert(status.isRollbackOnly())
}

@test
func testSetCompleted(): Unit {
    let status = DefaultTransactionStatus(newTransaction: true)

    status.setCompleted()

    assert(status.isCompleted())
}

// ============================================================================
// 事务模板测试
// ============================================================================

@test
func testExecuteSuccess(): Unit {
    // 创建一个简单的事务管理器实现用于测试
    let mockTm = MockTransactionManager()
    let template = TransactionTemplate(mockTm)

    let result = template.execute((status) => {
        "success"
    })

    assert(result == "success")
    assert(mockTm.committed)
}

@test
func testExecuteWithRollback(): Unit {
    let mockTm = MockTransactionManager()
    let template = TransactionTemplate(mockTm)

    try {
        template.execute<String>((status) => {
            status.setRollbackOnly()
            "should rollback"
        })
    } catch (_: Exception) {
        ()
    }

    assert(mockTm.rolledBack)
}

@test
func testExecuteWithException(): Unit {
    let mockTm = MockTransactionManager()
    let template = TransactionTemplate(mockTm)

    try {
        template.execute<String>((status) => {
            throw Exception("Test exception")
        })
        assert(false) // 应该抛出异常
    } catch (_: Exception) {
        assert(true)
    }

    assert(mockTm.rolledBack)
}

// 模拟事务管理器用于测试
class MockTransactionManager <: TransactionManager {
    public var committed: Bool = false
    public var rolledBack: Bool = false

    public func getTransaction(definition: TransactionDefinition): TransactionStatus {
        DefaultTransactionStatus(newTransaction: true)
    }

    public func commit(status: TransactionStatus): Unit {
        committed = true
    }

    public func rollback(status: TransactionStatus): Unit {
        rolledBack = true
    }
}

// ============================================================================
// 隔离级别测试
// ============================================================================

@test
func testIsolationLevelValues(): Unit {
    // 验证所有隔离级别都存在
    let defaultLevel = IsolationLevel.Default
    let readUncommitted = IsolationLevel.ReadUncommitted
    let readCommitted = IsolationLevel.ReadCommitted
    let repeatableRead = IsolationLevel.RepeatableRead
    let serializable = IsolationLevel.Serializable

    assert(true) // 如果能编译通过,说明枚举定义正确
}

// ============================================================================
// 传播行为测试
// ============================================================================

@test
func testPropagationValues(): Unit {
    // 验证所有传播行为都存在
    let required = Propagation.Required
    let supports = Propagation.Supports
    let mandatory = Propagation.Mandatory
    let requiresNew = Propagation.RequiresNew
    let notSupported = Propagation.NotSupported
    let never = Propagation.Never
    let nested = Propagation.Nested

    assert(true) // 如果能编译通过,说明枚举定义正确
}