// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

success("RecursiveOptionalStruct") {
    value = RecursiveOptionalBasicStruct{
        inner: RecursiveOptionalBasicStruct{
            inner: RecursiveOptionalBasicStruct{
                inner: null,
            },
        },
    },
    bytes = {
        v2 = [
            repeat(0xff):8,
            repeat(0xff):8,
            repeat(0x00):8,
        ],
    },
}

success("RecursiveVectorStruct") {
    // TODO(https://fxbug.dev/42169988) Enable this test for Rust.
    bindings_denylist = [rust],
    value = RecursiveVectorStruct{
        vec: [
            RecursiveVectorStruct{
                vec: [
                    RecursiveVectorStruct{
                        vec: [],
                    },
                ],
            },
        ],
    },
    bytes = {
        v2 = [
            num(1):8,
            repeat(0xff):8,

            num(1):8,
            repeat(0xff):8,

            num(0):8,
            repeat(0xff):8,
        ],
    },
}

success("RecursiveUnionStruct") {
    value = RecursiveUnionStruct{
        u: RecursiveUnion{
            s: RecursiveUnionStruct{
                u: RecursiveUnion{
                    s: RecursiveUnionStruct{
                        u: null,
                    },
                },
            },
        },
    },
    bytes = {
        v2 = [
            num(1):8,
            num(32):4, num(0):2, num(0):2,

            num(1):8,
            num(16):4, num(0):2, num(0):2,

            num(0):8,
            num(0):4, num(0):2, num(0):2,
        ],
    },
}

success("RecursiveTableStruct") {
    value = RecursiveTableHolder{
        t: RecursiveTable{
            s: RecursiveTableOptionalHolder{
                o: RecursiveTableHolder{
                    t: RecursiveTable{
                        s: RecursiveTableOptionalHolder{
                            o: RecursiveTableHolder{
                                t: RecursiveTable{
                                    s: RecursiveTableOptionalHolder{
                                        o: null,
                                    },
                                },
                            },
                        },
                    },
                },
            },
        },
    },
    bytes = {
        v2 = [
            num(1):8,
            repeat(0xff):8,
            num(72):4, num(0):2, num(0):2,
            repeat(0xff):8,

            num(1):8,
            repeat(0xff):8,
            num(40):4, num(0):2, num(0):2,
            repeat(0xff):8,

            num(1):8,
            repeat(0xff):8,
            num(8):4, num(0):2, num(0):2,
            repeat(0x00):8,
        ],
    },
}
