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

package gc

import (
	"testing"
)

func nodrune(r rune) *Node {
	v := new(Mpint)
	v.SetInt64(int64(r))
	v.Rune = true
	return nodlit(Val{v})
}

func nodflt(f float64) *Node {
	v := newMpflt()
	v.SetFloat64(f)
	return nodlit(Val{v})
}

func TestCaseClauseByConstVal(t *testing.T) {
	tests := []struct {
		a, b *Node
	}{
		// CTFLT
		{nodflt(0.1), nodflt(0.2)},
		// CTINT
		{nodintconst(0), nodintconst(1)},
		// CTRUNE
		{nodrune('a'), nodrune('b')},
		// CTSTR
		{nodlit(Val{"ab"}), nodlit(Val{"abc"})},
		{nodlit(Val{"ab"}), nodlit(Val{"xyz"})},
		{nodlit(Val{"abc"}), nodlit(Val{"xyz"})},
	}
	for i, test := range tests {
		a := caseClause{node: nod(OXXX, test.a, nil)}
		b := caseClause{node: nod(OXXX, test.b, nil)}
		s := caseClauseByConstVal{a, b}
		if less := s.Less(0, 1); !less {
			t.Errorf("%d: caseClauseByConstVal(%v, %v) = false", i, test.a, test.b)
		}
		if less := s.Less(1, 0); less {
			t.Errorf("%d: caseClauseByConstVal(%v, %v) = true", i, test.a, test.b)
		}
	}
}
