phys-collision 2.0.1-beta.0

Provides collision detection ability
// Copyright (C) 2020-2025 phys-collision authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

use approx_det::assert_relative_eq;
use wasm_bindgen_test::*;

use super::common::get_input_wide;
use crate::collision_tasks::tests::common::{
    convex2contact_manifold_wide_to_convex2contact_manifold, Convex2ContactManifold, TestInput,
};
use crate::collision_tasks::ShapeWideTester;
use crate::shapes::CapsuleWide;
use crate::traits::PairWideTest;
use crate::Capsule;

type CapsuleCapsuleInput = TestInput<Capsule, Capsule>;

wasm_bindgen_test_configure!(run_in_browser);
const ADJUST_DEPTH_FACTOR: f32 = 0.5;

#[test]
#[wasm_bindgen_test]
fn test_collision_head_to_head_penetrate() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input1_head_to_head_penetrate.json");
    let file_output = include_bytes!("resource/capsule_capsule/output1.json");

    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}

#[test]
#[wasm_bindgen_test]
fn test_collision_head_to_head_tangent() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input2_head_to_head_tangent.json");
    let file_output = include_bytes!("resource/capsule_capsule/output2.json");
    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}

#[test]
#[wasm_bindgen_test]
fn test_collision_head_to_head_close() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input3_head_to_head_close.json");
    let file_output = include_bytes!("resource/capsule_capsule/output3.json");

    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}

#[test]
#[wasm_bindgen_test]
fn test_collision_head_to_body_penetrate() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input4_head_to_body_penetrate.json");
    let file_output = include_bytes!("resource/capsule_capsule/output4.json");

    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}

#[test]
#[wasm_bindgen_test]
fn test_collision_head_to_body_tangent() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input5_head_to_body_tangent.json");
    let file_output = include_bytes!("resource/capsule_capsule/output5.json");

    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}

#[test]
#[wasm_bindgen_test]
fn test_collision_head_to_body_close() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input6_head_to_body_close.json");
    let file_output = include_bytes!("resource/capsule_capsule/output6.json");

    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}

#[test]
#[wasm_bindgen_test]
fn test_collision_body_to_body_penetrate() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input7_body_to_body_penetrate.json");
    let file_output = include_bytes!("resource/capsule_capsule/output7.json");

    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}

#[test]
#[wasm_bindgen_test]
fn test_collision_body_to_body_tangent() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input8_body_to_body_tangent.json");
    let file_output = include_bytes!("resource/capsule_capsule/output8.json");

    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}

#[test]
#[wasm_bindgen_test]
fn test_collision_body_to_body_close() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input9_body_to_body_close.json");
    let file_output = include_bytes!("resource/capsule_capsule/output9.json");

    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}

// -- collision_tasks::tests::capsule_capsule::test_collision_body_to_body_close

#[test]
#[wasm_bindgen_test]
fn test_collision_head_to_body_larger_size() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input10_larger_size.json");
    let file_output = include_bytes!("resource/capsule_capsule/output10.json");

    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}

#[test]
#[wasm_bindgen_test]
fn test_collision_head_to_body_random1() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input11_random.json");
    let file_output = include_bytes!("resource/capsule_capsule/output11.json");
    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}

#[test]
#[wasm_bindgen_test]
fn test_collision_head_to_body_random2() {
    let _ = env_logger::builder().is_test(true).try_init();

    let file_input = include_bytes!("resource/capsule_capsule/input12_random.json");
    let file_output = include_bytes!("resource/capsule_capsule/output12.json");
    let input0: CapsuleCapsuleInput =
        serde_json::from_slice(file_input).expect("file should be proper JSON");
    let mut output0: Convex2ContactManifold =
        serde_json::from_slice(file_output).expect("file should be proper JSON");
    output0.adjust_offset_a_to_shape_surface(ADJUST_DEPTH_FACTOR);
    let array = [input0];
    let outputs = [output0];
    let pair_count = array.len();
    TestWide!(
        CapsuleWide,
        CapsuleWide,
        array,
        pair_count,
        outputs,
        convex2contact_manifold_wide_to_convex2contact_manifold
    );
}