/*******************************************************************************
 *
 *    Copyright (c) 2026 Haixing Hu.
 *
 *    SPDX-License-Identifier: Apache-2.0
 *
 *    Licensed under the Apache License, Version 2.0.
 *
 ******************************************************************************/
//! Tests for the public `JsonTopLevelKind` type in `json_top_level_kind.rs`.
//!

use serde_json::json;

use qubit_json::JsonTopLevelKind;
use std::str::FromStr;

#[test]
fn test_top_level_kind_classifies_values() {
    assert_eq!(JsonTopLevelKind::of(&json!({})), JsonTopLevelKind::Object);
    assert_eq!(JsonTopLevelKind::of(&json!([])), JsonTopLevelKind::Array);
    assert_eq!(JsonTopLevelKind::of(&json!(true)), JsonTopLevelKind::Other);
}

#[test]
fn test_top_level_kind_from_matches_of() {
    let value = json!([1, 2, 3]);
    assert_eq!(JsonTopLevelKind::from(&value), JsonTopLevelKind::of(&value));
}

#[test]
fn test_top_level_kind_display_uses_lowercase_names() {
    assert_eq!(JsonTopLevelKind::Object.to_string(), "object");
    assert_eq!(JsonTopLevelKind::Array.to_string(), "array");
    assert_eq!(JsonTopLevelKind::Other.to_string(), "other");
}

#[test]
fn test_top_level_kind_from_str() {
    assert_eq!(
        JsonTopLevelKind::from_str("object").unwrap(),
        JsonTopLevelKind::Object
    );
    assert_eq!(
        JsonTopLevelKind::from_str("ARRAY").unwrap(),
        JsonTopLevelKind::Array
    );
    assert_eq!(
        JsonTopLevelKind::from_str("other").unwrap(),
        JsonTopLevelKind::Other
    );
    assert!(JsonTopLevelKind::from_str("dict").is_err());
}
