// Protocol Buffers - Google's data interchange format
// Copyright 2024 Google LLC.  All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd

mod sys {
    pub use super::super::super::*;
}

use core::ptr::NonNull;
use sys::base::ctype::CType;
use sys::mem::arena::RawArena;
use sys::message::message::RawMessage;
use sys::message::message_value::upb_MessageValue;
use sys::opaque_pointee::opaque_pointee;

opaque_pointee!(upb_Array);
pub type RawArray = NonNull<upb_Array>;

unsafe extern "C" {
    pub fn upb_Array_New(a: RawArena, r#type: CType) -> RawArray;
    pub fn upb_Array_Size(arr: RawArray) -> usize;
    pub fn upb_Array_Set(arr: RawArray, i: usize, val: upb_MessageValue);
    pub fn upb_Array_Get(arr: RawArray, i: usize) -> upb_MessageValue;
    pub fn upb_Array_Append(arr: RawArray, val: upb_MessageValue, arena: RawArena) -> bool;
    pub fn upb_Array_Resize(arr: RawArray, size: usize, arena: RawArena) -> bool;
    pub fn upb_Array_Reserve(arr: RawArray, size: usize, arena: RawArena) -> bool;
    pub fn upb_Array_MutableDataPtr(arr: RawArray) -> *mut core::ffi::c_void;
    pub fn upb_Array_DataPtr(arr: RawArray) -> *const core::ffi::c_void;
    pub fn upb_Array_GetMutable(arr: RawArray, i: usize) -> RawMessage;
}

#[cfg(test)]
mod tests {
    use super::super::super::test_helpers::TestArena;
    use super::*;
    use googletest::gtest;

    #[gtest]
    fn assert_array_linked() {
        use crate::assert_linked;
        assert_linked!(upb_Array_New);
        assert_linked!(upb_Array_Size);
        assert_linked!(upb_Array_Set);
        assert_linked!(upb_Array_Get);
        assert_linked!(upb_Array_Append);
        assert_linked!(upb_Array_Resize);
        assert_linked!(upb_Array_Reserve);
        assert_linked!(upb_Array_MutableDataPtr);
        assert_linked!(upb_Array_DataPtr);
        assert_linked!(upb_Array_GetMutable);
    }

    #[gtest]
    fn array_ffi_test() {
        // SAFETY: FFI unit test uses C API under expected patterns.
        unsafe {
            let arena = TestArena::new();
            let raw_arena = arena.raw();
            let array = upb_Array_New(raw_arena, CType::Float);

            assert!(upb_Array_Append(array, upb_MessageValue { float_val: 7.0 }, raw_arena));
            assert!(upb_Array_Append(array, upb_MessageValue { float_val: 42.0 }, raw_arena));
            assert_eq!(upb_Array_Size(array), 2);
            assert_eq!(upb_Array_Get(array, 1).float_val, 42.0);

            assert!(upb_Array_Resize(array, 3, raw_arena));
            assert_eq!(upb_Array_Size(array), 3);
            assert_eq!(upb_Array_Get(array, 2).float_val, 0.0);
        }
    }
}
