// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. 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 model_test

import (
	"encoding/json"
	"testing"

	"go.elastic.co/fastjson"
)

func BenchmarkMarshalTransactionFastJSON(b *testing.B) {
	p := fakeTransaction()
	b.ResetTimer()

	var w fastjson.Writer
	for i := 0; i < b.N; i++ {
		p.MarshalFastJSON(&w)
		b.SetBytes(int64(w.Size()))
		w.Reset()
	}
}

func BenchmarkMarshalTransactionStdlib(b *testing.B) {
	p := fakeTransaction()
	b.ResetTimer()

	var cw countingWriter
	encoder := json.NewEncoder(&cw)
	for i := 0; i < b.N; i++ {
		encoder.Encode(p)
		b.SetBytes(int64(cw.n))
		cw.n = 0
	}
}

type countingWriter struct {
	n int
}

func (w *countingWriter) Write(p []byte) (int, error) {
	w.n += len(p)
	return len(p), nil
}
