// Part of the Crubit project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

//! Tests for ctor macros, focusing on their use from external crates.
//!
//! To assist testing hygiene, this module must not add any imports (e.g. for
//! Pin, etc.), and must shadow std and ctor with "incorrect" modules to
//! ensure that the macros do not depend on that aspect of the caller.
#![cfg(test)]
// Allow unused imports so that we can produce pathological aliases.
#![allow(unused_imports)]

// pathological shadowed names: shadow important modules that the macros use.
mod std {}
mod ctor {}

/// Expand emplace!{let ...} to test for hygiene.
#[test]
fn test_emplace_stmt_hygiene() {
    ::ctor::emplace! {
        let _x1 = 0;
        let mut _x2 = 0;
        let _x3 : ::std::pin::Pin<&mut u32> = 0;
        let mut _x4 : ::std::pin::Pin<&mut u32> = 0;
    }
}

/// Expand emplace!(expr) to test for hygiene.
#[test]
fn test_emplace_expr_hygiene() {
    let _ = ::ctor::emplace!(4);
}

/// Expand ctor!{Struct{...}} to test for hygiene.
#[test]
fn test_ctor_struct_hygiene() {
    struct Struct {
        x: i32,
    }
    unsafe impl ::ctor::RecursivelyPinned for Struct {
        type CtorInitializedFields = Self;
    }
    let _ = ::ctor::ctor! {Struct { x: 0 }};
}

/// Expand ctor!{TupleStruct(...)} to test for hygiene.
#[test]
fn test_ctor_tuple_struct_hygiene() {
    struct TupleStruct(i32);
    unsafe impl ::ctor::RecursivelyPinned for TupleStruct {
        type CtorInitializedFields = Self;
    }
    let _ = ::ctor::ctor! {TupleStruct(0)};
}
