#!/usr/bin/env python

# Copyright (c) 2015 The Khronos Group Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and/or associated documentation files (the
# "Materials"), to deal in the Materials without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Materials, and to
# permit persons to whom the Materials are furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Materials.
#
# THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.

"""
  Generator for tex-2d* and tex-3d* tests.
  This file needs to be run in its folder.
"""

import os
import os.path
import sys

_LICENSE = """<!--

Copyright (c) 2015 The Khronos Group Inc.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and/or associated documentation files (the
"Materials"), to deal in the Materials without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Materials, and to
permit persons to whom the Materials are furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Materials.

THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.

-->

"""

_DO_NOT_EDIT_WARNING = """<!--

This file is auto-generated from py/tex_image_test_generator.py
DO NOT EDIT!

-->

"""

_ELEMENT_TYPES = [
  'canvas',
  'canvas-sub-rectangle',
  'image',
  'image-data',
  'svg-image',
  'video',
  'webgl-canvas',
  'image-bitmap-from-image-data',
  'image-bitmap-from-image',
  'image-bitmap-from-video',
  'image-bitmap-from-canvas',
  'image-bitmap-from-blob',
  'image-bitmap-from-image-bitmap'
]

_FORMATS_TYPES_WEBGL1 = [
  {'internal_format': 'RGB', 'format': 'RGB', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'RGB', 'format': 'RGB', 'type': 'UNSIGNED_SHORT_5_6_5' },
  {'internal_format': 'RGBA', 'format': 'RGBA', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'RGBA', 'format': 'RGBA', 'type': 'UNSIGNED_SHORT_4_4_4_4' },
  {'internal_format': 'RGBA', 'format': 'RGBA', 'type': 'UNSIGNED_SHORT_5_5_5_1' },
  {'internal_format': 'LUMINANCE',       'format': 'LUMINANCE',       'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'ALPHA',           'format': 'ALPHA',           'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'LUMINANCE_ALPHA', 'format': 'LUMINANCE_ALPHA', 'type': 'UNSIGNED_BYTE' },
]

_FORMATS_TYPES_WEBGL2 = [
  {'internal_format': 'R8', 'format': 'RED', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'R16F', 'format': 'RED', 'type': 'HALF_FLOAT' },
  {'internal_format': 'R16F', 'format': 'RED', 'type': 'FLOAT' },
  {'internal_format': 'R32F', 'format': 'RED', 'type': 'FLOAT' },
  {'internal_format': 'R8UI', 'format': 'RED_INTEGER', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'RG8', 'format': 'RG', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'RG16F', 'format': 'RG', 'type': 'HALF_FLOAT' },
  {'internal_format': 'RG16F', 'format': 'RG', 'type': 'FLOAT' },
  {'internal_format': 'RG32F', 'format': 'RG', 'type': 'FLOAT' },
  {'internal_format': 'RG8UI', 'format': 'RG_INTEGER', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'RGB8', 'format': 'RGB', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'SRGB8', 'format': 'RGB', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'RGB565', 'format': 'RGB', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'RGB565', 'format': 'RGB', 'type': 'UNSIGNED_SHORT_5_6_5' },
  {'internal_format': 'R11F_G11F_B10F', 'format': 'RGB', 'type': 'UNSIGNED_INT_10F_11F_11F_REV' },
  {'internal_format': 'R11F_G11F_B10F', 'format': 'RGB', 'type': 'HALF_FLOAT' },
  {'internal_format': 'R11F_G11F_B10F', 'format': 'RGB', 'type': 'FLOAT' },
  {'internal_format': 'RGB9_E5', 'format': 'RGB', 'type': 'HALF_FLOAT' },
  {'internal_format': 'RGB9_E5', 'format': 'RGB', 'type': 'FLOAT' },
  {'internal_format': 'RGB16F', 'format': 'RGB', 'type': 'HALF_FLOAT' },
  {'internal_format': 'RGB16F', 'format': 'RGB', 'type': 'FLOAT' },
  {'internal_format': 'RGB32F', 'format': 'RGB', 'type': 'FLOAT' },
  {'internal_format': 'RGB8UI', 'format': 'RGB_INTEGER', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'RGBA8', 'format': 'RGBA', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'SRGB8_ALPHA8', 'format': 'RGBA', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'RGB5_A1', 'format': 'RGBA', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'RGB5_A1', 'format': 'RGBA', 'type': 'UNSIGNED_SHORT_5_5_5_1' },
  {'internal_format': 'RGB10_A2', 'format': 'RGBA', 'type': 'UNSIGNED_INT_2_10_10_10_REV' },
  {'internal_format': 'RGBA4', 'format': 'RGBA', 'type': 'UNSIGNED_BYTE' },
  {'internal_format': 'RGBA4', 'format': 'RGBA', 'type': 'UNSIGNED_SHORT_4_4_4_4' },
  {'internal_format': 'RGBA16F', 'format': 'RGBA', 'type': 'HALF_FLOAT' },
  {'internal_format': 'RGBA16F', 'format': 'RGBA', 'type': 'FLOAT' },
  {'internal_format': 'RGBA32F', 'format': 'RGBA', 'type': 'FLOAT' },
  {'internal_format': 'RGBA8UI', 'format': 'RGBA_INTEGER', 'type': 'UNSIGNED_BYTE' },
]

def GenerateFilename(dimension, element_type, internal_format, format, type):
  """Generate test filename."""
  filename = ("tex-" + dimension + "d-" +
              internal_format + "-" + format + "-" + type + ".html")
  return filename.lower()

def WriteTest(filename, dimension, element_type, internal_format, format, type, default_context_version):
  """Write one test."""
  file = open(filename, "wb")
  file.write(_LICENSE)
  file.write(_DO_NOT_EDIT_WARNING)
  code = """
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<script src="../../../js/js-test-pre.js"></script>
<script src="../../../js/webgl-test-utils.js"></script>
<script src="../../../js/tests/tex-image-and-sub-image-utils.js"></script>"""
  if element_type == 'image-bitmap-from-image-data' or element_type == 'image-bitmap-from-image' or \
     element_type == 'image-bitmap-from-video' or element_type == 'image-bitmap-from-canvas' or \
     element_type == 'image-bitmap-from-blob' or element_type == 'image-bitmap-from-image-bitmap':
    code += """
<script src="../../../js/tests/tex-image-and-sub-image-with-image-bitmap-utils.js"></script>"""
  code += """
<script src="../../../js/tests/tex-image-and-sub-image-%(dimension)sd-with-%(element_type)s.js"></script>
</head>
<body>"""
  if element_type == 'image-data':
    code += """
<canvas id="texcanvas" width="2" height="2"></canvas>"""
  code += """
<canvas id="example" width="32" height="32"></canvas>"""
  code += """
<div id="description"></div>
<div id="console"></div>
<script>
"use strict";
function testPrologue(gl) {
    return true;
}

generateTest("%(internal_format)s", "%(format)s", "%(type)s", testPrologue, "../../../resources/", %(default_context_version)s)();
</script>
</body>
</html>
"""
  file.write(code % {
    'dimension': dimension,
    'element_type': element_type,
    'internal_format': internal_format,
    'format': format,
    'type': type,
    'default_context_version': default_context_version,
  })
  file.close()

def GenerateTests(test_dir, test_cases, dimension, default_context_version):
  test_dir_template = test_dir + '/%s'
  for element_type in _ELEMENT_TYPES:
    os.chdir(test_dir_template % element_type.replace('-', '_'))
    if dimension == '3':
      # Assume we write 2D tests first.
      index_file = open("00_test_list.txt", "ab")
    else:
      index_file = open("00_test_list.txt", "wb")
    for tex_info in test_cases:
      internal_format = tex_info['internal_format']
      format = tex_info['format']
      type = tex_info['type']
      filename = GenerateFilename(dimension, element_type, internal_format, format, type)
      index_file.write(filename)
      index_file.write('\n')
      WriteTest(filename, dimension, element_type, internal_format, format, type, default_context_version)
    index_file.close();

def main(argv):
  """This is the main function."""
  py_dir = os.path.dirname(os.path.realpath(__file__))
  GenerateTests(os.path.realpath(py_dir + '/../conformance/textures'), _FORMATS_TYPES_WEBGL1, '2', '1')
  GenerateTests(os.path.realpath(py_dir + '/../conformance2/textures'), _FORMATS_TYPES_WEBGL2, '2', '2')
  GenerateTests(os.path.realpath(py_dir + '/../conformance2/textures'), _FORMATS_TYPES_WEBGL2, '3', '2')

if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))
