/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
 * This source file is part of the Cangjie project, licensed under Apache-2.0
 * with Runtime Library Exception.
 *
 * See https://cangjie-lang.cn/pages/LICENSE for license information.
 */

// The Cangjie API is in Beta. For details on its capabilities and limitations, please refer to the README file.

package std.unittest.diff

import std.unittest.common.PrettyPrinter

extend<T> Option<T> <: AssertPrintable<Option<T>> where T <: Equatable<T> {
    public prop hasNestedDiff: Bool {
        get() { false }
    }

    public func pprintForAssertion(pp: PrettyPrinter, right: Option<T>, leftPrefix: String, rightPrefix: String,
        level: Int64): PrettyPrinter {
        return pp.pprintOptionDiff(this, right, leftPrefix, rightPrefix, level)
    }
}

extend PrettyPrinter {
    func pprintOptionDiff<T>(left: Option<T>, right: Option<T>, leftPrefix: String, rightPrefix: String, level: Int64) {
        match (left) {
            case Some(l) =>
                match (right) {
                    case Some(r) => pprintForAssertionOrSimple(l, r, leftPrefix, rightPrefix, level)
                    case None => pprintLeftRight(l, right, leftPrefix, rightPrefix)
                }
            case None =>
                match (right) {
                    case Some(r) => pprintLeftRight(left, r, leftPrefix, rightPrefix)
                    case None => () // then assertion is passed
                }
        }
        return this
    }
}