// Copyright 2018 Google LLC
//
// 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.

package firestore

import (
	"math"
	"testing"
	"time"

	pb "google.golang.org/genproto/googleapis/firestore/v1beta1"
	"google.golang.org/genproto/googleapis/type/latlng"
)

func TestCompareValues(t *testing.T) {
	// Ordered list of values.
	vals := []*pb.Value{
		nullValue,
		boolval(false),
		boolval(true),
		floatval(math.NaN()),
		floatval(math.Inf(-1)),
		floatval(-math.MaxFloat64),
		int64val(math.MinInt64),
		floatval(-1.1),
		intval(-1),
		intval(0),
		floatval(math.SmallestNonzeroFloat64),
		intval(1),
		floatval(1.1),
		intval(2),
		int64val(math.MaxInt64),
		floatval(math.MaxFloat64),
		floatval(math.Inf(1)),
		tsval(time.Date(2016, 5, 20, 10, 20, 0, 0, time.UTC)),
		tsval(time.Date(2016, 10, 21, 15, 32, 0, 0, time.UTC)),
		strval(""),
		strval("\u0000\ud7ff\ue000\uffff"),
		strval("(╯°□°）╯︵ ┻━┻"),
		strval("a"),
		strval("abc def"),
		strval("e\u0301b"),
		strval("æ"),
		strval("\u00e9a"),
		bytesval([]byte{}),
		bytesval([]byte{0}),
		bytesval([]byte{0, 1, 2, 3, 4}),
		bytesval([]byte{0, 1, 2, 4, 3}),
		bytesval([]byte{255}),
		refval("projects/p1/databases/d1/documents/c1/doc1"),
		refval("projects/p1/databases/d1/documents/c1/doc2"),
		refval("projects/p1/databases/d1/documents/c1/doc2/c2/doc1"),
		refval("projects/p1/databases/d1/documents/c1/doc2/c2/doc2"),
		refval("projects/p1/databases/d1/documents/c10/doc1"),
		refval("projects/p1/databases/dkkkkklkjnjkkk1/documents/c2/doc1"),
		refval("projects/p2/databases/d2/documents/c1/doc1"),
		refval("projects/p2/databases/d2/documents/c1-/doc1"),
		geopoint(-90, -180),
		geopoint(-90, 0),
		geopoint(-90, 180),
		geopoint(0, -180),
		geopoint(0, 0),
		geopoint(0, 180),
		geopoint(1, -180),
		geopoint(1, 0),
		geopoint(1, 180),
		geopoint(90, -180),
		geopoint(90, 0),
		geopoint(90, 180),
		arrayval(),
		arrayval(strval("bar")),
		arrayval(strval("foo")),
		arrayval(strval("foo"), intval(1)),
		arrayval(strval("foo"), intval(2)),
		arrayval(strval("foo"), strval("0")),
		mapval(map[string]*pb.Value{"bar": intval(0)}),
		mapval(map[string]*pb.Value{"bar": intval(0), "foo": intval(1)}),
		mapval(map[string]*pb.Value{"foo": intval(1)}),
		mapval(map[string]*pb.Value{"foo": intval(2)}),
		mapval(map[string]*pb.Value{"foo": strval("0")}),
	}

	for i, v1 := range vals {
		if got := compareValues(v1, v1); got != 0 {
			t.Errorf("compare(%v, %v) == %d, want 0", v1, v1, got)
		}
		for _, v2 := range vals[i+1:] {
			if got := compareValues(v1, v2); got != -1 {
				t.Errorf("compare(%v, %v) == %d, want -1", v1, v2, got)
			}
			if got := compareValues(v2, v1); got != 1 {
				t.Errorf("compare(%v, %v) == %d, want 1", v1, v2, got)
			}
		}
	}

	// Integers and Doubles order the same.
	n1 := intval(17)
	n2 := floatval(17)
	if got := compareValues(n1, n2); got != 0 {
		t.Errorf("compare(%v, %v) == %d, want 0", n1, n2, got)
	}
}

func geopoint(lat, lng float64) *pb.Value {
	return geoval(&latlng.LatLng{Latitude: lat, Longitude: lng})
}
