/*
 * Copyright (C) 2011-2012 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.
 */

package android.renderscript.cts;

import android.renderscript.Element;
import android.renderscript.Element.DataType;
import android.renderscript.Element.DataKind;
import android.renderscript.RSIllegalArgumentException;

public class ElementTest extends RSBaseCompute {

    public void testCreatePixel() {
        assertTrue(Element.createPixel(mRS,
                                       DataType.UNSIGNED_8,
                                       DataKind.PIXEL_A) != null);
        assertTrue(Element.createPixel(mRS,
                                       DataType.UNSIGNED_5_6_5,
                                       DataKind.PIXEL_RGB) != null);
        assertTrue(Element.createPixel(mRS,
                                       DataType.UNSIGNED_8,
                                       DataKind.PIXEL_RGB) != null);
        assertTrue(Element.createPixel(mRS,
                                       DataType.UNSIGNED_5_5_5_1,
                                       DataKind.PIXEL_RGBA) != null);
        assertTrue(Element.createPixel(mRS,
                                       DataType.UNSIGNED_4_4_4_4,
                                       DataKind.PIXEL_RGBA) != null);
        assertTrue(Element.createPixel(mRS,
                                       DataType.UNSIGNED_8,
                                       DataKind.PIXEL_RGBA) != null);
    }

    public void testCreateVector() {

        Element e = null;
        for (int len = 2; len <= 4; len ++) {
            assertTrue(Element.createVector(mRS, DataType.FLOAT_32, len) != null);
            assertTrue(Element.createVector(mRS, DataType.FLOAT_64, len) != null);
            assertTrue(Element.createVector(mRS, DataType.SIGNED_8, len) != null);
            assertTrue(Element.createVector(mRS, DataType.SIGNED_16, len) != null);
            assertTrue(Element.createVector(mRS, DataType.SIGNED_32, len) != null);
            assertTrue(Element.createVector(mRS, DataType.SIGNED_64, len) != null);
            assertTrue(Element.createVector(mRS, DataType.UNSIGNED_8, len) != null);
            assertTrue(Element.createVector(mRS, DataType.UNSIGNED_16, len) != null);
            assertTrue(Element.createVector(mRS, DataType.UNSIGNED_32, len) != null);
            assertTrue(Element.createVector(mRS, DataType.UNSIGNED_64, len) != null);
        }
    }

    public void testPrebuiltElements() {
        assertTrue(Element.A_8(mRS) != null);
        assertTrue(Element.RGBA_4444(mRS) != null);
        assertTrue(Element.RGBA_5551(mRS) != null);
        assertTrue(Element.RGB_565(mRS) != null);
        assertTrue(Element.RGB_888(mRS) != null);
        assertTrue(Element.RGBA_8888(mRS) != null);
        assertTrue(Element.F32(mRS) != null);
        assertTrue(Element.F32_2(mRS) != null);
        assertTrue(Element.F32_3(mRS) != null);
        assertTrue(Element.F32_4(mRS) != null);
        assertTrue(Element.F64(mRS) != null);
        assertTrue(Element.F64_2(mRS) != null);
        assertTrue(Element.F64_3(mRS) != null);
        assertTrue(Element.F64_4(mRS) != null);
        assertTrue(Element.I8(mRS) != null);
        assertTrue(Element.I8_2(mRS) != null);
        assertTrue(Element.I8_3(mRS) != null);
        assertTrue(Element.I8_4(mRS) != null);
        assertTrue(Element.I16(mRS) != null);
        assertTrue(Element.I16_2(mRS) != null);
        assertTrue(Element.I16_3(mRS) != null);
        assertTrue(Element.I16_4(mRS) != null);
        assertTrue(Element.I32(mRS) != null);
        assertTrue(Element.I32_2(mRS) != null);
        assertTrue(Element.I32_3(mRS) != null);
        assertTrue(Element.I32_4(mRS) != null);
        assertTrue(Element.I64(mRS) != null);
        assertTrue(Element.I64_2(mRS) != null);
        assertTrue(Element.I64_3(mRS) != null);
        assertTrue(Element.I64_4(mRS) != null);
        assertTrue(Element.U8(mRS) != null);
        assertTrue(Element.U8_2(mRS) != null);
        assertTrue(Element.U8_3(mRS) != null);
        assertTrue(Element.U8_4(mRS) != null);
        assertTrue(Element.U16(mRS) != null);
        assertTrue(Element.U16_2(mRS) != null);
        assertTrue(Element.U16_3(mRS) != null);
        assertTrue(Element.U16_4(mRS) != null);
        assertTrue(Element.U32(mRS) != null);
        assertTrue(Element.U32_2(mRS) != null);
        assertTrue(Element.U32_3(mRS) != null);
        assertTrue(Element.U32_4(mRS) != null);
        assertTrue(Element.U64(mRS) != null);
        assertTrue(Element.U64_2(mRS) != null);
        assertTrue(Element.U64_3(mRS) != null);
        assertTrue(Element.U64_4(mRS) != null);
        assertTrue(Element.MATRIX_2X2(mRS) != null);
        assertTrue(Element.MATRIX_3X3(mRS) != null);
        assertTrue(Element.MATRIX_4X4(mRS) != null);
        assertTrue(Element.MATRIX4X4(mRS) != null);
        assertTrue(Element.MESH(mRS) != null);
        assertTrue(Element.PROGRAM_FRAGMENT(mRS) != null);
        assertTrue(Element.PROGRAM_RASTER(mRS) != null);
        assertTrue(Element.PROGRAM_STORE(mRS) != null);
        assertTrue(Element.PROGRAM_VERTEX(mRS) != null);
        assertTrue(Element.ALLOCATION(mRS) != null);
        assertTrue(Element.SAMPLER(mRS) != null);
        assertTrue(Element.SCRIPT(mRS) != null);
        assertTrue(Element.TYPE(mRS) != null);
        assertTrue(Element.BOOLEAN(mRS) != null);
        assertTrue(Element.ELEMENT(mRS) != null);
    }

    public void testEquals() {
        assertTrue(Element.A_8(mRS).equals(Element.A_8(mRS)));
        assertFalse(Element.A_8(mRS).equals(Element.U8(mRS)));

        // Compatible elements
        assertTrue(Element.A_8(mRS).isCompatible(Element.U8(mRS)));
        assertTrue(Element.U8(mRS).isCompatible(Element.A_8(mRS)));

        // Verify equivalence of user-built Elements
        Element.Builder eb1 = new Element.Builder(mRS);
        eb1.add(Element.I8(mRS), "Test");
        Element e1 = eb1.add(Element.U8(mRS), "UTest").create();

        assertTrue(e1.equals(e1));

        Element.Builder eb2 = new Element.Builder(mRS);
        eb2.add(Element.I8(mRS), "Test");
        Element e2 = eb2.add(Element.U8(mRS), "UTest").create();

        assertTrue(e1.equals(e2));
        assertTrue(e2.equals(e1));
        assertTrue(e1.hashCode() == e2.hashCode());
        assertTrue(e1.isCompatible(e2));
        assertTrue(e2.isCompatible(e1));

        // Check name differences
        Element.Builder eb3 = new Element.Builder(mRS);
        eb3.add(Element.I8(mRS), "Test");
        Element e3 = eb3.add(Element.U8(mRS), "NotUTest").create();

        assertFalse(e1.equals(e3));
        assertFalse(e3.equals(e1));
        assertFalse(e1.isCompatible(e3));
        assertFalse(e3.isCompatible(e1));

        eb1.add(Element.I8(mRS), "Another");
        assertFalse(e1.equals(eb1.create()));
        assertFalse(eb1.create().equals(e1));

        // Compatible sub-elements but neither equal nor compatible
        Element.Builder eb4 = new Element.Builder(mRS);
        eb4.add(Element.I8(mRS), "Test");
        Element e4 = eb4.add(Element.A_8(mRS), "UTest").create();

        assertFalse(e1.equals(e4));
        assertFalse(e4.equals(e1));
        assertFalse(e1.isCompatible(e4));
        assertFalse(e4.isCompatible(e1));

        // Check identity from same builder
        assertTrue(eb1.create().isCompatible(eb1.create()));
    }

    public void testIsCompatible() {
        Element[] ALLOCATION = { Element.ALLOCATION(mRS) };
        // A_8 is in U8
        Element[] BOOLEAN = { Element.BOOLEAN(mRS) };
        Element[] ELEMENT = { Element.ELEMENT(mRS) };
        Element[] F32 = { Element.F32(mRS) };
        Element[] F32_2 = { Element.F32_2(mRS),
            Element.createVector(mRS, Element.DataType.FLOAT_32, 2) };
        Element[] F32_3 = { Element.F32_3(mRS),
            Element.createVector(mRS, Element.DataType.FLOAT_32, 3) };
        Element[] F32_4 = { Element.F32_4(mRS),
            Element.createVector(mRS, Element.DataType.FLOAT_32, 4) };
        Element[] F64 = { Element.F64(mRS) };
        Element[] I16 = { Element.I16(mRS) };
        Element[] I32 = { Element.I32(mRS) };
        Element[] I64 = { Element.I64(mRS) };
        Element[] I8 = { Element.I8(mRS) };
        // MATRIX4X4 is in MATRIX_4X4
        Element[] MATRIX_2X2 = { Element.MATRIX_2X2(mRS) };
        Element[] MATRIX_3X3 = { Element.MATRIX_3X3(mRS) };
        Element[] MATRIX_4X4 = { Element.MATRIX4X4(mRS),
                                 Element.MATRIX_4X4(mRS) };
        Element[] MESH = { Element.MESH(mRS) };
        Element[] PROGRAM_FRAGMENT = { Element.PROGRAM_FRAGMENT(mRS) };
        Element[] PROGRAM_RASTER = { Element.PROGRAM_RASTER(mRS) };
        Element[] PROGRAM_STORE = { Element.PROGRAM_STORE(mRS) };
        Element[] PROGRAM_VERTEX = { Element.PROGRAM_VERTEX(mRS) };
        Element[] RGBA_4444 = { Element.RGBA_4444(mRS),
            Element.createPixel(mRS, Element.DataType.UNSIGNED_4_4_4_4,
                                Element.DataKind.PIXEL_RGBA) };
        Element[] RGBA_5551 = { Element.RGBA_5551(mRS),
            Element.createPixel(mRS, Element.DataType.UNSIGNED_5_5_5_1,
                                Element.DataKind.PIXEL_RGBA) };
        // RGBA_8888 is in U8_4
        Element[] RGB_565 = { Element.RGB_565(mRS),
            Element.createPixel(mRS, Element.DataType.UNSIGNED_5_6_5,
                                Element.DataKind.PIXEL_RGB) };
        // RGB_888 is in U8_3
        Element[] SAMPLER = { Element.SAMPLER(mRS) };
        Element[] SCRIPT = { Element.SCRIPT(mRS) };
        Element[] TYPE = { Element.TYPE(mRS) };
        Element[] U16 = { Element.U16(mRS) };
        Element[] U32 = { Element.U32(mRS) };
        Element[] U64 = { Element.U64(mRS) };
        Element[] U8 = { Element.A_8(mRS),
                         Element.U8(mRS),
            Element.createPixel(mRS, Element.DataType.UNSIGNED_8,
                                Element.DataKind.PIXEL_A) };
        Element[] U8_3 = { Element.RGB_888(mRS),
            Element.createVector(mRS, Element.DataType.UNSIGNED_8, 3),
            Element.createPixel(mRS, Element.DataType.UNSIGNED_8,
                                Element.DataKind.PIXEL_RGB) };
        Element[] U8_4 = { Element.U8_4(mRS),
                           Element.RGBA_8888(mRS),
            Element.createVector(mRS, Element.DataType.UNSIGNED_8, 4),
            Element.createPixel(mRS, Element.DataType.UNSIGNED_8,
                                Element.DataKind.PIXEL_RGBA) };

        Element[][] ElementArrs = { ALLOCATION, BOOLEAN, ELEMENT, F32, F32_2,
                                    F32_3, F32_4, F64, I16, I32, I64, I8,
                                    MATRIX_2X2, MATRIX_3X3, MATRIX_4X4, MESH,
                                    PROGRAM_FRAGMENT, PROGRAM_RASTER,
                                    PROGRAM_STORE, PROGRAM_VERTEX, RGBA_4444,
                                    RGBA_5551, RGB_565, SAMPLER, SCRIPT, TYPE,
                                    U16, U32, U64, U8, U8_3, U8_4 };

        int ElementArrsLen = ElementArrs.length;
        for (int i = 0; i < ElementArrsLen; i++) {
            for (int j = 0; j < ElementArrsLen; j++) {
                for (Element el : ElementArrs[i]) {
                    for (Element er : ElementArrs[j]) {
                        if (i == j) {
                            // Elements within a group are compatible
                            assertTrue(el.isCompatible(er));
                        } else {
                            // Elements from different groups are incompatible
                            assertFalse(el.isCompatible(er));
                        }
                    }
                }
            }
        }
    }

    public void testElementBuilder() {
        for (int arraySize = 1; arraySize <= 3; arraySize++) {
            // Now test array size
            Element.Builder eb = new Element.Builder(mRS);
            eb.add(Element.A_8(mRS), "A_8", arraySize);
            eb.add(Element.RGBA_4444(mRS), "RGBA_4444", arraySize);
            eb.add(Element.RGBA_5551(mRS), "RGBA_5551", arraySize);
            eb.add(Element.RGB_565(mRS), "RGB_565", arraySize);
            eb.add(Element.RGB_888(mRS), "RGB_888", arraySize);
            eb.add(Element.RGBA_8888(mRS), "RGBA_8888", arraySize);
            eb.add(Element.F32(mRS), "F32", arraySize);
            eb.add(Element.F32_2(mRS), "F32_2", arraySize);
            eb.add(Element.F32_3(mRS), "F32_3", arraySize);
            eb.add(Element.F32_4(mRS), "F32_4", arraySize);
            eb.add(Element.F64(mRS), "F64", arraySize);
            eb.add(Element.F64_2(mRS), "F64_2", arraySize);
            eb.add(Element.F64_3(mRS), "F64_3", arraySize);
            eb.add(Element.F64_4(mRS), "F64_4", arraySize);
            eb.add(Element.I8(mRS), "I8", arraySize);
            eb.add(Element.I8_2(mRS), "I8_2", arraySize);
            eb.add(Element.I8_3(mRS), "I8_3", arraySize);
            eb.add(Element.I8_4(mRS), "I8_4", arraySize);
            eb.add(Element.I16(mRS), "I16", arraySize);
            eb.add(Element.I16_2(mRS), "I16_2", arraySize);
            eb.add(Element.I16_3(mRS), "I16_3", arraySize);
            eb.add(Element.I16_4(mRS), "I16_4", arraySize);
            eb.add(Element.I32(mRS), "I32", arraySize);
            eb.add(Element.I32_2(mRS), "I32_2", arraySize);
            eb.add(Element.I32_3(mRS), "I32_3", arraySize);
            eb.add(Element.I32_4(mRS), "I32_4", arraySize);
            eb.add(Element.I64(mRS), "I64", arraySize);
            eb.add(Element.I64_2(mRS), "I64_2", arraySize);
            eb.add(Element.I64_3(mRS), "I64_3", arraySize);
            eb.add(Element.I64_4(mRS), "I64_4", arraySize);
            eb.add(Element.U8(mRS), "U8", arraySize);
            eb.add(Element.U8_2(mRS), "U8_2", arraySize);
            eb.add(Element.U8_3(mRS), "U8_3", arraySize);
            eb.add(Element.U8_4(mRS), "U8_4", arraySize);
            eb.add(Element.U16(mRS), "U16", arraySize);
            eb.add(Element.U16_2(mRS), "U16_2", arraySize);
            eb.add(Element.U16_3(mRS), "U16_3", arraySize);
            eb.add(Element.U16_4(mRS), "U16_4", arraySize);
            eb.add(Element.U32(mRS), "U32", arraySize);
            eb.add(Element.U32_2(mRS), "U32_2", arraySize);
            eb.add(Element.U32_3(mRS), "U32_3", arraySize);
            eb.add(Element.U32_4(mRS), "U32_4", arraySize);
            eb.add(Element.U64(mRS), "U64", arraySize);
            eb.add(Element.U64_2(mRS), "U64_2", arraySize);
            eb.add(Element.U64_3(mRS), "U64_3", arraySize);
            eb.add(Element.U64_4(mRS), "U64_4", arraySize);
            eb.add(Element.MATRIX_2X2(mRS), "MATRIX_2X2", arraySize);
            eb.add(Element.MATRIX_3X3(mRS), "MATRIX_3X3", arraySize);
            eb.add(Element.MATRIX_4X4(mRS), "MATRIX_4X4", arraySize);
            eb.add(Element.MATRIX4X4(mRS), "MATRIX4X4", arraySize);
            eb.add(Element.MESH(mRS), "MESH", arraySize);
            eb.add(Element.PROGRAM_FRAGMENT(mRS), "PROGRAM_FRAGMENT", arraySize);
            eb.add(Element.PROGRAM_RASTER(mRS), "PROGRAM_RASTER", arraySize);
            eb.add(Element.PROGRAM_STORE(mRS), "PROGRAM_STORE", arraySize);
            eb.add(Element.PROGRAM_VERTEX(mRS), "PROGRAM_VERTEX", arraySize);
            eb.add(Element.ALLOCATION(mRS), "ALLOCATION", arraySize);
            eb.add(Element.SAMPLER(mRS), "SAMPLER", arraySize);
            eb.add(Element.SCRIPT(mRS), "SCRIPT", arraySize);
            eb.add(Element.TYPE(mRS), "TYPE", arraySize);
            eb.add(Element.BOOLEAN(mRS), "BOOLEAN", arraySize);
            eb.add(Element.ELEMENT(mRS), "ELEMENT", arraySize);
            assertTrue(eb.create() != null);
        }
    }

    public void testIsComplex() {
        assertFalse(Element.A_8(mRS).isComplex());
        assertFalse(Element.RGBA_4444(mRS).isComplex());
        assertFalse(Element.RGBA_5551(mRS).isComplex());
        assertFalse(Element.RGB_565(mRS).isComplex());
        assertFalse(Element.RGB_888(mRS).isComplex());
        assertFalse(Element.RGBA_8888(mRS).isComplex());
        assertFalse(Element.F32(mRS).isComplex());
        assertFalse(Element.F32_2(mRS).isComplex());
        assertFalse(Element.F32_3(mRS).isComplex());
        assertFalse(Element.F32_4(mRS).isComplex());
        assertFalse(Element.F64(mRS).isComplex());
        assertFalse(Element.F64_2(mRS).isComplex());
        assertFalse(Element.F64_3(mRS).isComplex());
        assertFalse(Element.F64_4(mRS).isComplex());
        assertFalse(Element.I8(mRS).isComplex());
        assertFalse(Element.I8_2(mRS).isComplex());
        assertFalse(Element.I8_3(mRS).isComplex());
        assertFalse(Element.I8_4(mRS).isComplex());
        assertFalse(Element.I16(mRS).isComplex());
        assertFalse(Element.I16_2(mRS).isComplex());
        assertFalse(Element.I16_3(mRS).isComplex());
        assertFalse(Element.I16_4(mRS).isComplex());
        assertFalse(Element.I32(mRS).isComplex());
        assertFalse(Element.I32_2(mRS).isComplex());
        assertFalse(Element.I32_3(mRS).isComplex());
        assertFalse(Element.I32_4(mRS).isComplex());
        assertFalse(Element.I64(mRS).isComplex());
        assertFalse(Element.I64_2(mRS).isComplex());
        assertFalse(Element.I64_3(mRS).isComplex());
        assertFalse(Element.I64_4(mRS).isComplex());
        assertFalse(Element.U8(mRS).isComplex());
        assertFalse(Element.U8_2(mRS).isComplex());
        assertFalse(Element.U8_3(mRS).isComplex());
        assertFalse(Element.U8_4(mRS).isComplex());
        assertFalse(Element.U16(mRS).isComplex());
        assertFalse(Element.U16_2(mRS).isComplex());
        assertFalse(Element.U16_3(mRS).isComplex());
        assertFalse(Element.U16_4(mRS).isComplex());
        assertFalse(Element.U32(mRS).isComplex());
        assertFalse(Element.U32_2(mRS).isComplex());
        assertFalse(Element.U32_3(mRS).isComplex());
        assertFalse(Element.U32_4(mRS).isComplex());
        assertFalse(Element.U64(mRS).isComplex());
        assertFalse(Element.U64_2(mRS).isComplex());
        assertFalse(Element.U64_3(mRS).isComplex());
        assertFalse(Element.U64_4(mRS).isComplex());
        assertFalse(Element.MATRIX_2X2(mRS).isComplex());
        assertFalse(Element.MATRIX_3X3(mRS).isComplex());
        assertFalse(Element.MATRIX_4X4(mRS).isComplex());
        assertFalse(Element.MATRIX4X4(mRS).isComplex());
        assertFalse(Element.MESH(mRS).isComplex());
        assertFalse(Element.PROGRAM_FRAGMENT(mRS).isComplex());
        assertFalse(Element.PROGRAM_RASTER(mRS).isComplex());
        assertFalse(Element.PROGRAM_STORE(mRS).isComplex());
        assertFalse(Element.PROGRAM_VERTEX(mRS).isComplex());
        assertFalse(Element.ALLOCATION(mRS).isComplex());
        assertFalse(Element.SAMPLER(mRS).isComplex());
        assertFalse(Element.SCRIPT(mRS).isComplex());
        assertFalse(Element.TYPE(mRS).isComplex());
        assertFalse(Element.BOOLEAN(mRS).isComplex());
        assertFalse(Element.ELEMENT(mRS).isComplex());

        Element.Builder eb = new Element.Builder(mRS);
        eb.add(Element.F32(mRS), "FLOAT");
        eb.add(Element.SAMPLER(mRS), "SAMPLER");
        Element e1 = eb.create();
        assertFalse(e1.isComplex());

        eb = new Element.Builder(mRS);
        eb.add(Element.A_8(mRS), "A_8");
        eb.add(Element.RGBA_4444(mRS), "RGBA_4444");
        Element e2 = eb.create();
        assertFalse(e2.isComplex());

        eb = new Element.Builder(mRS);
        eb.add(e1, "e1");
        eb.add(e2, "e2");
        assertTrue(eb.create().isComplex());
    }

    public void testDataType() {
        // Uncomment when NONE is no longer hidden.
        //assertEquals(DataType.NONE, DataType.valueOf("NONE"));

        assertEquals(DataType.FLOAT_32, DataType.valueOf("FLOAT_32"));
        assertEquals(DataType.FLOAT_64, DataType.valueOf("FLOAT_64"));
        assertEquals(DataType.SIGNED_8, DataType.valueOf("SIGNED_8"));
        assertEquals(DataType.SIGNED_16, DataType.valueOf("SIGNED_16"));
        assertEquals(DataType.SIGNED_32, DataType.valueOf("SIGNED_32"));
        assertEquals(DataType.SIGNED_64, DataType.valueOf("SIGNED_64"));
        assertEquals(DataType.UNSIGNED_8, DataType.valueOf("UNSIGNED_8"));
        assertEquals(DataType.UNSIGNED_16, DataType.valueOf("UNSIGNED_16"));
        assertEquals(DataType.UNSIGNED_32, DataType.valueOf("UNSIGNED_32"));
        assertEquals(DataType.UNSIGNED_64, DataType.valueOf("UNSIGNED_64"));

        assertEquals(DataType.BOOLEAN, DataType.valueOf("BOOLEAN"));

        assertEquals(DataType.UNSIGNED_5_6_5, DataType.valueOf("UNSIGNED_5_6_5"));
        assertEquals(DataType.UNSIGNED_5_5_5_1, DataType.valueOf("UNSIGNED_5_5_5_1"));
        assertEquals(DataType.UNSIGNED_4_4_4_4, DataType.valueOf("UNSIGNED_4_4_4_4"));

        assertEquals(DataType.MATRIX_4X4, DataType.valueOf("MATRIX_4X4"));
        assertEquals(DataType.MATRIX_3X3, DataType.valueOf("MATRIX_3X3"));
        assertEquals(DataType.MATRIX_2X2, DataType.valueOf("MATRIX_2X2"));

        assertEquals(DataType.RS_ELEMENT, DataType.valueOf("RS_ELEMENT"));
        assertEquals(DataType.RS_TYPE, DataType.valueOf("RS_TYPE"));
        assertEquals(DataType.RS_ALLOCATION, DataType.valueOf("RS_ALLOCATION"));
        assertEquals(DataType.RS_SAMPLER, DataType.valueOf("RS_SAMPLER"));
        assertEquals(DataType.RS_SCRIPT, DataType.valueOf("RS_SCRIPT"));
        assertEquals(DataType.RS_MESH, DataType.valueOf("RS_MESH"));
        assertEquals(DataType.RS_PROGRAM_FRAGMENT, DataType.valueOf("RS_PROGRAM_FRAGMENT"));
        assertEquals(DataType.RS_PROGRAM_VERTEX, DataType.valueOf("RS_PROGRAM_VERTEX"));
        assertEquals(DataType.RS_PROGRAM_RASTER, DataType.valueOf("RS_PROGRAM_RASTER"));
        assertEquals(DataType.RS_PROGRAM_STORE, DataType.valueOf("RS_PROGRAM_STORE"));
        // Make sure no new enums are added
        assertEquals(30, DataType.values().length);

        for (DataType dt : DataType.values()) {
            switch (dt) {
            case FLOAT_32:
            case FLOAT_64:
            case SIGNED_8:
            case SIGNED_16:
            case SIGNED_32:
            case SIGNED_64:
            case UNSIGNED_8:
            case UNSIGNED_16:
            case UNSIGNED_32:
            case UNSIGNED_64:
            case BOOLEAN:
                Element.createVector(mRS, dt, 2);
                break;

            default: {
                try {
                    Element.createVector(mRS, dt, 2);
                    fail("should throw RSIllegalArgumentException");
                } catch (RSIllegalArgumentException e) {
                }
                break;
            }
            }
        }
    }

    public void testDataKind() {
        assertEquals(DataKind.USER, DataKind.valueOf("USER"));

        assertEquals(DataKind.PIXEL_L, DataKind.valueOf("PIXEL_L"));
        assertEquals(DataKind.PIXEL_A, DataKind.valueOf("PIXEL_A"));
        assertEquals(DataKind.PIXEL_LA, DataKind.valueOf("PIXEL_LA"));
        assertEquals(DataKind.PIXEL_RGB, DataKind.valueOf("PIXEL_RGB"));
        assertEquals(DataKind.PIXEL_RGBA, DataKind.valueOf("PIXEL_RGBA"));
        assertEquals(DataKind.PIXEL_DEPTH, DataKind.valueOf("PIXEL_DEPTH"));
        assertEquals(DataKind.PIXEL_YUV, DataKind.valueOf("PIXEL_YUV"));
        // Make sure no new enums are added
        assertEquals(8, DataKind.values().length);

        for (DataKind dk : DataKind.values()) {
            if (dk != DataKind.USER && dk != DataKind.PIXEL_YUV) {
                Element.createPixel(mRS, DataType.UNSIGNED_8, dk);
            }
        }
    }
}


