package querycodec

import (
	"testing"
)

func TestParserSelectionGrammarMatchesExecutableRuntimeCapability(t *testing.T) {
	for _, query := range []string{
		"SELECT Id, Name FROM Account",
		"SELECT COUNT() FROM Account",
		"SELECT COUNT(Id), SUM(Amount), AVG(Amount), MIN(Amount), MAX(Amount) FROM Opportunity",
	} {
		if _, err := ParseSOQL(query); err != nil {
			t.Fatalf("ParseSOQL(%q): %v", query, err)
		}
	}

	for _, query := range []string{
		"SELECT COUNT_DISTINCT(Id) FROM Account",
		"SELECT CALENDAR_MONTH(CreatedDate) FROM Account",
		"SELECT SUM() FROM Opportunity",
		"SELECT SUM(COUNT(Id)) FROM Opportunity",
		"SELECT SUM(Amount, Id) FROM Opportunity",
		"SELECT Id, (SELECT COUNT(Id) FROM Contacts) FROM Account",
		"SELECT Id FROM Account ORDER BY COUNT(Id)",
		"SELECT Id, (SELECT Id FROM Contacts ORDER BY COUNT(Id)) FROM Account",
	} {
		if _, err := ParseSOQL(query); err == nil {
			t.Fatalf("ParseSOQL(%q) accepted a clause shape the neutral Runtime capability cannot represent", query)
		}
	}
}

func TestParserKeepsClosedFunctionsInPredicateOperands(t *testing.T) {
	parsed, err := ParseSOQL("SELECT Id FROM Account WHERE CALENDAR_MONTH(CreatedDate) = 7")
	if err != nil {
		t.Fatalf("ParseSOQL predicate function: %v", err)
	}
	if parsed.Filter.Kind != PredicateComparison || parsed.Filter.Left.Kind != OperandFunction || parsed.Filter.Left.Function != "CALENDAR_MONTH" {
		t.Fatalf("Filter = %#v, want typed CALENDAR_MONTH function operand", parsed.Filter)
	}
}
