/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */
package rocketmq

import (
	"github.com/stretchr/testify/assert"
	"testing"
)

func TestMessage_String(t *testing.T) {
	msg := Message{
		Topic:          "testTopic",
		Tags:           "TagA, TagB",
		Keys:           "Key1, Key2",
		Body:           "Body1234567890",
		DelayTimeLevel: 8}
	expect := "[Topic: testTopic, Tags: TagA, TagB, Keys: Key1, Key2, Body: Body1234567890, DelayTimeLevel: 8," +
		" Property: map[]]"
	assert.Equal(t, expect, msg.String())
}

func TestMessageExt_String(t *testing.T) {
	msg := Message{
		Topic:          "testTopic",
		Tags:           "TagA, TagB",
		Keys:           "Key1, Key2",
		Body:           "Body1234567890",
		DelayTimeLevel: 8}
	msgExt := MessageExt{
		Message:                   msg,
		MessageID:                 "messageId",
		QueueId:                   2,
		ReconsumeTimes:            13,
		StoreSize:                 1 << 10,
		BornTimestamp:             int64(1234567890897),
		StoreTimestamp:            int64(1234567890),
		QueueOffset:               int64(1234567890),
		CommitLogOffset:           int64(1234567890),
		PreparedTransactionOffset: int64(1234567890),
	}
	expect := "[MessageId: messageId, [Topic: testTopic, Tags: TagA, TagB, Keys: Key1, Key2, " +
		"Body: Body1234567890, DelayTimeLevel: 8, Property: map[]], QueueId: 2, ReconsumeTimes: " +
		"13, StoreSize: 1024, BornTimestamp: 1234567890897, StoreTimestamp: 1234567890, QueueOffset: 1234567890," +
		" CommitLogOffset: 1234567890, PreparedTransactionOffset: 1234567890]"
	assert.Equal(t, expect, msgExt.String())
}
