# -*- coding: utf-8 -*-

#-------------------------------------------------------------------------
# drawElements Quality Program utilities
# --------------------------------------
#
# Copyright 2015 The Android Open Source Project
#
# 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.
#
#-------------------------------------------------------------------------

import sys
from genutil import *

# Templates

reservedOperatorCaseTemplate = """
case operator_${{NAME}}
	expect compile_fail
	values {}

	both ""
		precision mediump float;
		precision mediump int;

		${DECLARATIONS}

		void main()
		{
			${SETUP}
			int value = 100;
			${{OP}}
			${OUTPUT}
		}
	""
end
"""[1:-1]

# Classes

class ReservedOperatorCase(ShaderCase):
	def __init__(self, op):
		self.name		= op.name
		if op.operator == "~":
			self.operation = 'value = ~value;'
		else:
			self.operation	= 'value ' + op.operator + ' 1;'

	def __str__(self):
		params = {
			"NAME": self.name,
			"OP"  : self.operation
		}
		return fillTemplate(reservedOperatorCaseTemplate, params)


class Operator():
	def __init__(self, operator, name):
		self.operator	= operator
		self.name		= name

# Declarations

RESERVED_OPERATORS = [
	Operator("%",	"modulo"),
	Operator("~",	"bitwise_not"),
	Operator("<<",	"bitwise_shift_left"),
	Operator(">>",	"bitwise_shift_right"),
	Operator("&",	"bitwise_and"),
	Operator("^",	"bitwise_xor"),
	Operator("|",	"bitwise_or"),
	Operator("%=",	"assign_modulo"),
	Operator("<<=",	"assign_shift_left"),
	Operator(">>=", "assign_shift_right"),
	Operator("&=",	"assign_and"),
	Operator("^=",	"assign_xor"),
	Operator("|=",	"assign_or")
]

# Reserved operator usage cases

reservedOperatorCases = []

for operator in RESERVED_OPERATORS:
	reservedOperatorCases.append(ReservedOperatorCase(operator))		# Reserved operators

# Main program

if __name__ == "__main__":
	print("Generating shader case files.")
	writeAllCases("reserved_operators.test",	reservedOperatorCases)
