/**
 * Copyright 2024 Beijing Baolande Software Corporation
 *
 * 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.
 *
 * Runtime Library Exception to the Apache 2.0 License:
 *
 * As an exception, if you use this Software to compile your source code and
 * portions of this Software are embedded into the binary product as a result,
 * you may redistribute such product without providing attribution as would
 * otherwise be required by Sections 4(a), 4(b) and 4(d) of the License.
 */

package hyperion.buffer

import std.unittest.testmacro.*

/**
 * 辅助ByteBuffer单元测试的工具类
 * 
 * @author yangfuping
 */
public class ByteBufferTestUtis {
    private static let logger = LoggerFactory.getLogger("transport")

    static let LINE_SPERATOR = "--------------------------------------------------------------------------------\n"

    static func putAndGetByte(buffer: ByteBuffer, position: Int64, value: Byte) {
        putUInt8(buffer, value)
        getByteAtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getByteAtPosition(buffer, value)
        buffer.clear()
    }

    protected static func putAndGetUInt16(buffer: ByteBuffer, position: Int64, value: UInt16) {
        putUInt16(buffer, value)
        getUInt16AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt16AtPosition(buffer, value)
        buffer.clear()
    }

    protected static func putAndGetUInt32(buffer: ByteBuffer, position: Int64, value: UInt32) {
        putUInt32(buffer, value)
        getUInt32AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt32AtPosition(buffer, value)
        buffer.clear()
    }

    protected static func putAndGetUInt64(buffer: ByteBuffer, position: Int64, value: UInt64) {
        putUInt64(buffer, value)
        getUInt64AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt64AtPosition(buffer, value)
        buffer.clear()
    }

    static func putAndGetInt8(buffer: ByteBuffer, position: Int64, value: Int8) {
        putInt8(buffer, value)
        getInt8AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt8AtPosition(buffer, value)
        buffer.clear()
    }

    static func putAndGetInt16(buffer: ByteBuffer, position: Int64, value: Int16) {
        putInt16(buffer, value)
        getInt16AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt16AtPosition(buffer, value)
        buffer.clear()
    }

    protected static func putAndGetInt32(buffer: ByteBuffer, position: Int64, value: Int32) {
        putInt32(buffer, value)
        getInt32AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt32AtPosition(buffer, value)
        buffer.clear()
    }

    protected static func putAndGetInt64(buffer: ByteBuffer, position: Int64, value: Int64) {
        putInt64(buffer, value)
        getInt64AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt64AtPosition(buffer, value)
        buffer.clear()
    }

    static func expandPutAndGetByte(buffer: ByteBuffer, value: Byte) {
        let size = 1

        //测试没有扩容
        buffer.position(buffer.capacity() - size)
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt8 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        var position = buffer.position()
        var limit = buffer.limit()
        var capacity = buffer.capacity()
        var remaining = buffer.remaining()

        buffer.expandAndPutByte(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt8 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)

        getByteAtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getByteAtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了
        buffer.position(buffer.capacity())
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt8 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutByte(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt8 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getByteAtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getByteAtPosition(buffer, value)
        buffer.clear()
    }

    static func expandPutAndGetUInt16(buffer: ByteBuffer, value: UInt16) {
        let size = 2

        //测试没有扩容
        buffer.position(buffer.capacity() - size)
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt16 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        var position = buffer.position()
        var limit = buffer.limit()
        var capacity = buffer.capacity()
        var remaining = buffer.remaining()

        buffer.expandAndPutUInt16(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt16 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)

        getUInt16AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt16AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 差1个字节存储数据
        buffer.position(buffer.capacity() - (size - 1))
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt16 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutUInt16(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt16 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getUInt16AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt16AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 差size - 1个字节存储数据
        buffer.position(buffer.capacity() - 1)
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt16 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutUInt16(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt16 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getUInt16AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt16AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了
        buffer.position(buffer.capacity())
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt16 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutUInt16(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt16 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getUInt16AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt16AtPosition(buffer, value)
        buffer.clear()
    }

    static func expandPutAndGetUInt32(buffer: ByteBuffer, value: UInt32) {
        let size = 4

        //测试没有扩容
        buffer.position(buffer.capacity() - size)
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt32 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        var position = buffer.position()
        var limit = buffer.limit()
        var capacity = buffer.capacity()
        var remaining = buffer.remaining()

        buffer.expandAndPutUInt32(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt32 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)

        getUInt32AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt32AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 容量剩余为size - 1字节
        buffer.position(buffer.capacity() - (size - 1))
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt32 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutUInt32(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt32 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getUInt32AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt32AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 容量剩余为1字节
        buffer.position(buffer.capacity() - 1)
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt32 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutUInt32(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt32 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getUInt32AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt32AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了,容量剩余为0
        buffer.position(buffer.capacity())
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt32 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutUInt32(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt32 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getUInt32AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt32AtPosition(buffer, value)
        buffer.clear()
    }

    static func expandPutAndGetUInt64(buffer: ByteBuffer, value: UInt64) {
        let size = 8

        //测试没有扩容
        buffer.position(buffer.capacity() - size)
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt64 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        var position = buffer.position()
        var limit = buffer.limit()
        var capacity = buffer.capacity()
        var remaining = buffer.remaining()

        buffer.expandAndPutUInt64(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt64 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)

        getUInt64AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt64AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 容量剩余为size - 1字节
        buffer.position(buffer.capacity() - (size - 1))
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt64 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutUInt64(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt64 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getUInt64AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt64AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 容量剩余为1字节
        buffer.position(buffer.capacity() - 1)
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt64 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutUInt64(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt64 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getUInt64AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt64AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了,容量剩余为0
        buffer.position(buffer.capacity())
        logger.log(
            LogLevel.INFO,
            "Expand and put UInt64 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutUInt64(value)
        logger.log(LogLevel.INFO, "After Expand and put UInt64 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getUInt64AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getUInt64AtPosition(buffer, value)
        buffer.clear()
    }

    static func expandPutAndGetInt8(buffer: ByteBuffer, value: Int8) {
        let size = 1

        //测试没有扩容
        buffer.position(buffer.capacity() - size)
        logger.log(
            LogLevel.INFO,
            "Expand and put Int8 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        var position = buffer.position()
        var limit = buffer.limit()
        var capacity = buffer.capacity()
        var remaining = buffer.remaining()

        buffer.expandAndPutInt8(value)
        logger.log(LogLevel.INFO, "After Expand and put Int8 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)

        getInt8AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt8AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了
        buffer.position(buffer.capacity())
        logger.log(
            LogLevel.INFO,
            "Expand and put Int8 value ${value} at position: ${buffer.position()}, Int8Buffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutInt8(value)
        logger.log(LogLevel.INFO, "After Expand and put Int8 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getInt8AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt8AtPosition(buffer, value)
        buffer.clear()
    }

    static func expandPutAndGetInt16(buffer: ByteBuffer, value: Int16) {
        let size = 2

        //测试没有扩容
        buffer.position(buffer.capacity() - size)
        logger.log(
            LogLevel.INFO,
            "Expand and put Int16 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        var position = buffer.position()
        var limit = buffer.limit()
        var capacity = buffer.capacity()
        var remaining = buffer.remaining()

        buffer.expandAndPutInt16(value)
        logger.log(LogLevel.INFO, "After Expand and put Int16 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)

        getInt16AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt16AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 差1个字节存储数据
        buffer.position(buffer.capacity() - (size - 1))
        logger.log(
            LogLevel.INFO,
            "Expand and put Int16 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutInt16(value)
        logger.log(LogLevel.INFO, "After Expand and put Int16 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getInt16AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt16AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 差size - 1个字节存储数据
        buffer.position(buffer.capacity() - 1)
        logger.log(
            LogLevel.INFO,
            "Expand and put Int16 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutInt16(value)
        logger.log(LogLevel.INFO, "After Expand and put Int16 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getInt16AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt16AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了
        buffer.position(buffer.capacity())
        logger.log(
            LogLevel.INFO,
            "Expand and put Int16 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutInt16(value)
        logger.log(LogLevel.INFO, "After Expand and put Int16 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getInt16AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt16AtPosition(buffer, value)
        buffer.clear()
    }

    static func expandPutAndGetInt32(buffer: ByteBuffer, value: Int32) {
        let size = 4

        //测试没有扩容
        buffer.position(buffer.capacity() - size)
        logger.log(
            LogLevel.INFO,
            "Expand and put Int32 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        var position = buffer.position()
        var limit = buffer.limit()
        var capacity = buffer.capacity()
        var remaining = buffer.remaining()

        buffer.expandAndPutInt32(value)
        logger.log(LogLevel.INFO, "After Expand and put Int32 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)

        getInt32AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt32AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 容量剩余为size - 1字节
        buffer.position(buffer.capacity() - (size - 1))
        logger.log(
            LogLevel.INFO,
            "Expand and put Int32 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutInt32(value)
        logger.log(LogLevel.INFO, "After Expand and put Int32 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getInt32AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt32AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 容量剩余为1字节
        buffer.position(buffer.capacity() - 1)
        logger.log(
            LogLevel.INFO,
            "Expand and put Int32 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutInt32(value)
        logger.log(LogLevel.INFO, "After Expand and put Int32 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getInt32AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt32AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了,容量剩余为0
        buffer.position(buffer.capacity())
        logger.log(
            LogLevel.INFO,
            "Expand and put Int32 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutInt32(value)
        logger.log(LogLevel.INFO, "After Expand and put Int32 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getInt32AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt32AtPosition(buffer, value)
        buffer.clear()
    }

    static func expandPutAndGetInt64(buffer: ByteBuffer, value: Int64) {
        let size = 8

        //测试没有扩容
        buffer.position(buffer.capacity() - size)
        logger.log(
            LogLevel.INFO,
            "Expand and put Int64 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        var position = buffer.position()
        var limit = buffer.limit()
        var capacity = buffer.capacity()
        var remaining = buffer.remaining()

        buffer.expandAndPutInt64(value)
        logger.log(LogLevel.INFO, "After expand and put Int64 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)

        getInt64AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt64AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 容量剩余为size - 1字节
        buffer.position(buffer.capacity() - (size - 1))
        logger.log(
            LogLevel.INFO,
            "Expand and put Int64 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutInt64(value)
        logger.log(LogLevel.INFO, "After expand and put Int64 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getInt64AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt64AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了, 容量剩余为1字节
        buffer.position(buffer.capacity() - 1)
        logger.log(
            LogLevel.INFO,
            "Expand and put Int64 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutInt64(value)
        logger.log(LogLevel.INFO, "After Expand and put Int64 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getInt64AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt64AtPosition(buffer, value)
        buffer.clear()

        // 测试扩容了,容量剩余为0
        buffer.position(buffer.capacity())
        logger.log(
            LogLevel.INFO,
            "Expand and put Int64 value ${value} at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPutInt64(value)
        logger.log(LogLevel.INFO, "After expand and put Int64 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getInt64AtIndex(buffer, position, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getInt64AtPosition(buffer, value)
        buffer.clear()
    }

    static func expandPutAndGetSimpleString(buffer: ByteBuffer, value: String) {
        let arr = value.toArray()
        let size = arr.size

        //测试没有扩容
        buffer.position(buffer.capacity() - size)
        logger.log(
            LogLevel.INFO,
            "Expand and put String value \"${value}\" at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        var position = buffer.position()
        var limit = buffer.limit()
        var capacity = buffer.capacity()
        var remaining = buffer.remaining()

        buffer.expandAndPut(arr)
        logger.log(LogLevel.INFO, "After Expand and put String value \"${value}\", ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)

        var retArr = Array<Byte>(size, repeat: 0)
        getStringAtIndex(buffer, position, retArr, value)

        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getStringAtPosition(buffer, retArr, value)
        buffer.clear()

        // 测试扩容了, 容量剩余为size - 1字节
        buffer.position(buffer.capacity() - (size - 1))
        logger.log(
            LogLevel.INFO,
            "Expand and put String value \"${value}\" at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        var largeArr = Array<Byte>(size + 20, repeat: 0)
        arr.copyTo(largeArr, 0, 20, arr.size)
        buffer.expandAndPut(largeArr, 20, arr.size)
        logger.log(LogLevel.INFO, "After Expand and put String value \"${value}\", ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        var largeRetArr = Array<Byte>(size + 20, repeat: 0)
        getStringAtIndex(buffer, position, largeRetArr, 20, arr.size, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getStringAtPosition(buffer, largeRetArr, 20, arr.size, value)
        buffer.clear()

        // 测试扩容了, 容量剩余为1字节
        buffer.position(buffer.capacity() - 1)
        logger.log(
            LogLevel.INFO,
            "Expand and put String value \"${value}\" at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        largeArr = Array<Byte>(size + 30, repeat: 0)
        arr.copyTo(largeArr, 0, 30, arr.size)
        buffer.expandAndPut(largeArr, 30, arr.size)
        logger.log(LogLevel.INFO, "After Expand and put String value \"${value}\", ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        largeRetArr = Array<Byte>(size + 30, repeat: 0)
        getStringAtIndex(buffer, position, largeRetArr, 30, arr.size, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getStringAtPosition(buffer, largeRetArr, 30, arr.size, value)
        buffer.clear()

        // 测试扩容了,容量剩余为0
        buffer.position(buffer.capacity())
        logger.log(
            LogLevel.INFO,
            "Expand and put String value \"${value}\" at position: ${buffer.position()}, ByteBuffer: ${buffer}"
        )

        position = buffer.position()
        limit = buffer.limit()
        capacity = buffer.capacity()
        remaining = buffer.remaining()

        buffer.expandAndPut(arr)
        logger.log(LogLevel.INFO, "After Expand and put String value \"${value}\", ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.capacity() != capacity)
        @Expect(buffer.limit() != limit)

        getStringAtIndex(buffer, position, retArr, value)
        buffer.flip()
        if (position != 0) {
            buffer.position(position)
        }
        getStringAtPosition(buffer, retArr, value)
        buffer.clear()
    }

    static func putUInt8(buffer: ByteBuffer, value: UInt8) {
        logger.log(LogLevel.INFO, "Put UInt8 value ${value} at position: ${buffer.position()}")

        let size = 1
        let position = buffer.position()
        let limit = buffer.limit()
        let capacity = buffer.capacity()
        let remaining = buffer.remaining()
        buffer.putByte(value)
        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)
        @Expect(buffer.capacity() == capacity)
        @Expect(buffer.remaining() == remaining -size)
        logger.log(LogLevel.INFO, "After put UInt8 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func putUInt16(buffer: ByteBuffer, value: UInt16) {
        logger.log(LogLevel.INFO, "Put UInt16 value ${value} at position: ${buffer.position()}")

        let size = 2
        let position = buffer.position()
        let limit = buffer.limit()
        let capacity = buffer.capacity()
        let remaining = buffer.remaining()
        buffer.putUInt16(value)
        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)
        @Expect(buffer.capacity() == capacity)
        @Expect(buffer.remaining() == remaining -size)
        logger.log(LogLevel.INFO, "After put UInt16 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func putUInt32(buffer: ByteBuffer, value: UInt32) {
        logger.log(LogLevel.INFO, "Put UInt32 value ${value} at position: ${buffer.position()}")

        let size = 4
        let position = buffer.position()
        let limit = buffer.limit()
        let capacity = buffer.capacity()
        let remaining = buffer.remaining()
        buffer.putUInt32(value)
        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)
        @Expect(buffer.capacity() == capacity)
        @Expect(buffer.remaining() == remaining -size)
        logger.log(LogLevel.INFO, "After put UInt32 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func putUInt64(buffer: ByteBuffer, value: UInt64) {
        logger.log(LogLevel.INFO, "Put UInt64 value ${value} at position: ${buffer.position()}")

        let size = 8
        let position = buffer.position()
        let limit = buffer.limit()
        let capacity = buffer.capacity()
        let remaining = buffer.remaining()
        buffer.putUInt64(value)
        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)
        @Expect(buffer.capacity() == capacity)
        @Expect(buffer.remaining() == remaining -size)
        logger.log(LogLevel.INFO, "After put UInt64 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func putInt8(buffer: ByteBuffer, value: Int8) {
        logger.log(LogLevel.INFO, "Put Int8 value ${value} at position: ${buffer.position()}")

        let size = 1
        let position = buffer.position()
        let limit = buffer.limit()
        let capacity = buffer.capacity()
        let remaining = buffer.remaining()
        buffer.putInt8(value)
        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)
        @Expect(buffer.capacity() == capacity)
        @Expect(buffer.remaining() == remaining -size)
        logger.log(LogLevel.INFO, "After put Int8 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func putInt16(buffer: ByteBuffer, value: Int16) {
        logger.log(LogLevel.INFO, "Put Int16 value ${value} at position: ${buffer.position()}")

        let size = 2
        let position = buffer.position()
        let limit = buffer.limit()
        let capacity = buffer.capacity()
        let remaining = buffer.remaining()
        buffer.putInt16(value)
        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)
        @Expect(buffer.capacity() == capacity)
        @Expect(buffer.remaining() == remaining -size)
        logger.log(LogLevel.INFO, "After put Int16 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func putInt32(buffer: ByteBuffer, value: Int32) {
        logger.log(LogLevel.INFO, "Put Int32 value ${value} at position: ${buffer.position()}")

        let size = 4
        let position = buffer.position()
        let limit = buffer.limit()
        let capacity = buffer.capacity()
        let remaining = buffer.remaining()
        buffer.putInt32(value)
        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)
        @Expect(buffer.capacity() == capacity)
        @Expect(buffer.remaining() == remaining -size)
        logger.log(LogLevel.INFO, "After put Int32 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func putInt64(buffer: ByteBuffer, value: Int64) {
        logger.log(LogLevel.INFO, "Put Int64 value ${value} at position: ${buffer.position()}")

        let size = 8
        let position = buffer.position()
        let limit = buffer.limit()
        let capacity = buffer.capacity()
        let remaining = buffer.remaining()
        buffer.putInt64(value)
        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)
        @Expect(buffer.capacity() == capacity)
        @Expect(buffer.remaining() == remaining -size)
        logger.log(LogLevel.INFO, "After put Int64 value ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func getByteAtPosition(buffer: ByteBuffer, expectValue: UInt8) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getUInt8() at position")
        var uInt8Ret = buffer.getByte()
        logger.log(LogLevel.INFO, "Get UInt8: ${uInt8Ret}, expect value ${expectValue}")
        @Expect(expectValue == uInt8Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func getUInt16AtPosition(buffer: ByteBuffer, expectValue: UInt16) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getUInt16() at position")
        var uInt16Ret = buffer.getUInt16()
        logger.log(LogLevel.INFO, "Get UInt16: ${uInt16Ret}, expect value ${expectValue}")
        @Expect(expectValue == uInt16Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func getUInt32AtPosition(buffer: ByteBuffer, expectValue: UInt32) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getUInt32() at position")
        var uInt32Ret = buffer.getUInt32()
        logger.log(LogLevel.INFO, "Get UInt32: ${uInt32Ret}, expect value ${expectValue}")
        @Expect(expectValue == uInt32Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func getUInt64AtPosition(buffer: ByteBuffer, expectValue: UInt64) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getUInt64() at position")
        var uInt64Ret = buffer.getUInt64()
        logger.log(LogLevel.INFO, "Get UInt64: ${uInt64Ret}, expect value ${expectValue}")
        @Expect(expectValue == uInt64Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func getInt8AtPosition(buffer: ByteBuffer, expectValue: Int8) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getInt8() at position")
        var int8Ret = buffer.getInt8()
        logger.log(LogLevel.INFO, "Get Int8: ${int8Ret}, expect value ${expectValue}")
        @Expect(expectValue == int8Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func getInt16AtPosition(buffer: ByteBuffer, expectValue: Int16) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getInt16() at position")
        var int16Ret = buffer.getInt16()
        logger.log(LogLevel.INFO, "Get Int16: ${int16Ret}, expect value ${expectValue}")
        @Expect(expectValue == int16Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func getInt32AtPosition(buffer: ByteBuffer, expectValue: Int32) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getInt32() at position")
        var int32Ret = buffer.getInt32()
        logger.log(LogLevel.INFO, "Get Int32: ${int32Ret}, expect value ${expectValue}")
        @Expect(expectValue == int32Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func getInt64AtPosition(buffer: ByteBuffer, expectValue: Int64) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getInt64() at position")
        var int64Ret = buffer.getInt64()
        logger.log(LogLevel.INFO, "Get Int64: ${int64Ret}, expect value ${expectValue}")
        @Expect(expectValue == int64Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
    }

    static func getByteAtIndex(buffer: ByteBuffer, index: Int64, expectValue: UInt8) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getUInt8(index:Int64)")
        var uInt8Ret = buffer.getByte(index)
        logger.log(LogLevel.INFO, "Get UInt8: ${uInt8Ret}, expect value ${expectValue}")
        @Expect(expectValue == uInt8Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
        return uInt8Ret
    }

    static func getUInt16AtIndex(buffer: ByteBuffer, index: Int64, expectValue: UInt16) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getUInt16(index:Int64)")
        var uInt16Ret = buffer.getUInt16(index)
        logger.log(LogLevel.INFO, "Get UInt16: ${uInt16Ret}, expect value ${expectValue}")
        @Expect(expectValue == uInt16Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
        return uInt16Ret
    }

    static func getUInt32AtIndex(buffer: ByteBuffer, index: Int64, expectValue: UInt32) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getUInt32(index:Int64)")
        var uInt32Ret = buffer.getUInt32(index)
        logger.log(LogLevel.INFO, "Get UInt32: ${uInt32Ret}, expect value ${expectValue}")
        @Expect(expectValue == uInt32Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
        return uInt32Ret
    }

    static func getUInt64AtIndex(buffer: ByteBuffer, index: Int64, expectValue: UInt64) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getUInt64(index:Int64)")
        var uInt64Ret = buffer.getUInt64(index)
        logger.log(LogLevel.INFO, "Get UInt64: ${uInt64Ret}, expect value ${expectValue}")
        @Expect(expectValue == uInt64Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
        return uInt64Ret
    }
    static func getInt8AtIndex(buffer: ByteBuffer, index: Int64, expectValue: Int8) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getUInt8(index:Int64)")
        var int8Ret = buffer.getInt8(index)
        logger.log(LogLevel.INFO, "Get Int8: ${int8Ret}, expect value ${expectValue}")
        @Expect(expectValue == int8Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
        return int8Ret
    }

    static func getInt16AtIndex(buffer: ByteBuffer, index: Int64, expectValue: Int16) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getInt16(index:Int64)")
        var int16Ret = buffer.getInt16(index)
        logger.log(LogLevel.INFO, "Get Int16: ${int16Ret}, expect value ${expectValue}")
        @Expect(expectValue == int16Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
        return int16Ret
    }

    static func getInt32AtIndex(buffer: ByteBuffer, index: Int64, expectValue: Int32) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getInt32(index:Int64)")
        var int32Ret = buffer.getInt32(index)
        logger.log(LogLevel.INFO, "Get Int32: ${int32Ret}, expect value ${expectValue}")
        @Expect(expectValue == int32Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
        return int32Ret
    }

    static func getInt64AtIndex(buffer: ByteBuffer, index: Int64, expectValue: Int64) {
        logger.log(LogLevel.INFO, "Test ByteBuffer.getInt64(index:Int64)")
        var int64Ret = buffer.getInt64(index)
        logger.log(LogLevel.INFO, "Get Int64: ${int64Ret}, expect value ${expectValue}")
        @Expect(expectValue == int64Ret)
        logger.log(LogLevel.INFO, LINE_SPERATOR)
        return int64Ret
    }

    static func putString(buffer: ByteBuffer, value: String): Int64 {
        logger.log(LogLevel.INFO, "Test put ${value} at position: ${buffer.position()}")
        var message1Array = value.toArray()
        let size = message1Array.size
        let position = buffer.position()
        let limit = buffer.limit()
        let capacity = buffer.capacity()
        let remaining = buffer.remaining()
        buffer.put(message1Array)

        @Expect(buffer.position() == position+size)
        @Expect(buffer.limit() == limit)
        @Expect(buffer.capacity() == capacity)
        @Expect(buffer.remaining() == remaining -size)
        logger.log(LogLevel.INFO, "After put ${value}, ByteBuffer: ${buffer}")
        logger.log(LogLevel.INFO, LINE_SPERATOR)
        return size
    }

    static func getStringAtIndex(buffer: ByteBuffer, index: Int64, dst: Array<Byte>, expectValue: String): String {
        logger.log(LogLevel.INFO, "Test ByteBuffer.get(index: Int64, dst: Array<Byte>) at index ${index}")

        buffer.get(index, dst)
        let retString = String.fromUtf8(dst)

        logger.log(LogLevel.INFO, "Get String: ${retString}, \nexpect value ${expectValue}")
        @Expect(expectValue == retString)
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        return retString
    }

    static func getStringAtIndex(
        buffer: ByteBuffer,
        index: Int64,
        dst: Array<Byte>,
        startPos: Int64,
        len: Int64,
        expectValue: String
    ): String {
        logger.log(
            LogLevel.INFO,
            "Test ByteBuffer.get(index: ${index}, array size: ${dst.size}, startPos: ${startPos}, length: ${len}) at index ${index}, buffer: ${buffer}"
        )

        buffer.get(index, dst, startPos, len)
        logger.log(
            LogLevel.INFO,
            "After ByteBuffer.get(index: ${index}, array size: ${dst.size}, startPos: ${startPos}, length: ${len}) at index ${index}, buffer: ${buffer}"
        )
        let retString = String.fromUtf8(dst[startPos..(startPos + len)])
        logger.log(
            LogLevel.INFO,
            "After ByteBuffer.get(index: ${index}, array size: ${dst.size}, startPos: ${startPos}, length: ${len}) at index ${index}, retString: ${retString}"
        )

        logger.log(LogLevel.INFO, "Get String: ${retString}, \nexpect value ${expectValue}")
        @Expect(expectValue == retString)
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        return retString
    }

    static func getStringAtPosition(buffer: ByteBuffer, dst: Array<Byte>, expectValue: String): String {
        logger.log(
            LogLevel.INFO,
            "Test ByteBuffer.get(dst: Array<Byte>) at position ${buffer.position()}, buffer: ${buffer}"
        )

        buffer.get(dst)
        let retString = String.fromUtf8(dst)

        logger.log(LogLevel.INFO, "Get String: ${retString}, \nexpect value ${expectValue}")
        @Expect(expectValue == retString)
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        return retString
    }

    static func getStringAtPosition(
        buffer: ByteBuffer,
        dst: Array<Byte>,
        startPos: Int64,
        len: Int64,
        expectValue: String
    ): String {
        logger.log(
            LogLevel.INFO,
            "Test ByteBuffer.get(dst: Array<Byte>, startPos: Int64, length: Int64) at position ${buffer.position()}"
        )

        buffer.get(dst, startPos, len)
        logger.log(
            LogLevel.INFO,
            "After ByteBuffer.get(dst: Array<Byte>, startPos: Int64, length: Int64), buffer: ${buffer}"
        )

        // let retArray = Array<Byte>(len, repeat: 0)
        // dst.copyTo(retArray, startPos, 0, len)
        let retString = String.fromUtf8(dst[startPos..(startPos + len)])
        logger.log(
            LogLevel.INFO,
            "After ByteBuffer.get(dst: Array<Byte>, startPos: Int64, length: Int64), retString: ${retString}"
        )

        logger.log(LogLevel.INFO, "Get String: ${retString}, \nexpect value ${expectValue}")
        @Expect(expectValue == retString)
        logger.log(LogLevel.INFO, LINE_SPERATOR)

        return retString
    }

    static func generateLengthedString(size: Int64): String {
        var i = 0
        let builder = StringBuilder(size)
        while (i < size) {
            builder.append(Rune(b'A' + UInt8(i % 26)))
            builder.append()
            i++
        }

        return builder.toString()
    }
}