moverox-build 0.2.6

Build script utilities to oxidize an entire Move package
Documentation
use std::path::Path;

use itertools::Itertools as _;
use testresult::TestResult;

use crate::move_package;

#[test]
fn generate_rust_for_move_stdlib() -> TestResult {
    let pkg_path = move_dir()?.join("move-stdlib");

    let builder = move_package(pkg_path, "MoveStdlib").published_at("0x1");
    let move_files = {
        let mut paths = builder.collect_move_files()?;
        paths.sort();
        paths
    };

    let files_found = move_files
        .iter()
        .map(|path| path.file_name().unwrap().display())
        .join("\n");
    insta::assert_snapshot!(files_found, @r"
    address.move
    ascii.move
    bcs.move
    bit_vector.move
    bool.move
    debug.move
    fixed_point32.move
    hash.move
    internal.move
    macros.move
    option.move
    string.move
    type_name.move
    u128.move
    u16.move
    u256.move
    u32.move
    u64.move
    u8.move
    unit_test.move
    uq32_32.move
    uq64_64.move
    vector.move
    ");

    let modules = builder.parse_files(&move_files)?;
    let rust_code = builder.generate_rust_str(&modules)?;

    let move_stdlib = prettyplease::unparse(&syn::parse_file(&rust_code).unwrap());
    insta::assert_snapshot!("MoveStdLib", move_stdlib);
    Ok(())
}

#[test]
fn generate_rust_for_sui_framework() -> TestResult {
    let pkg_path = move_dir()?.join("sui-framework");

    let builder = move_package(pkg_path, "Sui")
        .published_at("0x2")
        .with_implicit_sui_imports()
        .map_address("std", "::moverox_sui::std");
    let move_files = {
        let mut paths = builder.collect_move_files()?;
        paths.sort();
        paths
    };

    let files_found = move_files
        .iter()
        .map(|path| path.file_name().unwrap().display())
        .join("\n");
    insta::assert_snapshot!(files_found, @r"
    accumulator.move
    accumulator_metadata.move
    accumulator_settlement.move
    address.move
    address_alias.move
    authenticator_state.move
    bag.move
    balance.move
    bcs.move
    borrow.move
    clock.move
    coin.move
    config.move
    bls12381.move
    ecdsa_k1.move
    ecdsa_r1.move
    ecvrf.move
    ed25519.move
    groth16.move
    group_ops.move
    hash.move
    hmac.move
    nitro_attestation.move
    poseidon.move
    vdf.move
    zklogin_verified_id.move
    zklogin_verified_issuer.move
    deny_list.move
    derived_object.move
    display.move
    dynamic_field.move
    dynamic_object_field.move
    event.move
    funds_accumulator.move
    hex.move
    kiosk.move
    kiosk_extension.move
    transfer_policy.move
    linked_table.move
    math.move
    object.move
    object_bag.move
    object_table.move
    package.move
    party.move
    pay.move
    priority_queue.move
    protocol_config.move
    prover.move
    random.move
    coin_registry.move
    sui.move
    table.move
    table_vec.move
    test_scenario.move
    test_utils.move
    token.move
    transfer.move
    tx_context.move
    types.move
    url.move
    vec_map.move
    vec_set.move
    versioned.move
    ");

    let modules = builder.parse_files(&move_files)?;
    let rust_code = builder.generate_rust_str(&modules)?;

    let sui_framework = prettyplease::unparse(&syn::parse_file(&rust_code).unwrap());
    insta::assert_snapshot!("Sui", sui_framework);
    Ok(())
}

#[test]
fn generate_rust_for_enums() -> TestResult {
    let pkg_path = move_dir()?.join("enums");

    let builder = move_package(pkg_path, "Enums");
    let move_files = {
        let mut paths = builder.collect_move_files()?;
        paths.sort();
        paths
    };

    let files_found = move_files
        .iter()
        .map(|path| path.file_name().unwrap().display())
        .join("\n");
    insta::assert_snapshot!(files_found, @r"
    main.move
    other.move
    ");

    let modules = builder.parse_files(&move_files)?;
    let rust_code = builder.generate_rust_str(&modules)?;

    let enums = prettyplease::unparse(&syn::parse_file(&rust_code).unwrap());
    insta::assert_snapshot!("Enums", enums);
    Ok(())
}

fn move_dir() -> TestResult<std::path::PathBuf> {
    Ok(Path::new(env!("CARGO_MANIFEST_DIR"))
        .parent()
        .ok_or("moverox-build/../")?
        .parent()
        .ok_or("moverox-build/../../")?
        .join("move"))
}