#![allow(unexpected_cfgs)]
#![allow(deprecated)]

use loro::{LoroDoc, LoroError, ToJson};
use serde_json::json;
use tracing::debug_span;

#[ctor::ctor]
fn init() {
    dev_utils::setup_test_log();
}

#[test]
fn conflict_moves() -> Result<(), LoroError> {
    let doc1 = LoroDoc::new();
    doc1.set_peer_id(1)?;
    let list1 = doc1.get_movable_list("list");
    list1.insert(0, 1)?;
    list1.insert(1, 2)?;
    list1.insert(2, 3)?;
    assert_eq!(
        doc1.get_deep_value().to_json_value(),
        json!({
            "list": [1, 2, 3]
        })
    );

    // 0@1, 1@1, 2@1
    let doc2 = LoroDoc::new();
    doc2.import(&doc1.export_from(&Default::default()))?;
    doc2.set_peer_id(2)?;
    let list2 = doc2.get_movable_list("list");
    // [0@1], 1@1, 2@1, 3@1
    list1.mov(0, 2)?;
    list1.log_internal_state();
    // [0@1], 1@1, 0@2, 2@1
    list2.mov(0, 1)?;
    list2.log_internal_state();
    debug_span!("doc1 import").in_scope(|| {
        doc1.import(&doc2.export_from(&Default::default())).unwrap();
    });
    debug_span!("doc2 import").in_scope(|| {
        doc2.import(&doc1.export_from(&Default::default())).unwrap();
    });
    // [0@1], 1@1, 0@2, 2@1, 3@1
    //   -     2    1    3   (1)
    list1.log_internal_state();
    list2.log_internal_state();
    assert_eq!(doc1.get_deep_value(), doc2.get_deep_value());
    assert_eq!(
        doc1.get_deep_value().to_json_value(),
        json!({
            "list": [2, 1, 3]
        })
    );

    Ok(())
}
