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

package android.renderscript.cts;

import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Type;
import java.util.Random;

public class AllocationCopyPaddedTest extends RSBaseCompute {
    public void test_AllocationPadded_Byte3_1D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);;
        int arr_len = width * 3;

        byte[] inArray = new byte[arr_len];
        byte[] outArray = new byte[arr_len];
        random.nextBytes(inArray);

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_1D_Padded_Byte Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Byte3_2D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);
        int height = random.nextInt(128);
        int arr_len = width * height * 3;
        
        byte[] inArray = new byte[arr_len];
        byte[] outArray = new byte[arr_len];
        random.nextBytes(inArray);

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
        typeBuilder.setX(width).setY(height);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_2D_AllocationCopyTo_Padded_Byte Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Byte3_3D() {
        Random random = new Random(0x172d8ab9);
        int w = random.nextInt(32);
        int h = random.nextInt(32);
        int d = random.nextInt(32);
        int arr_len = w * d * h * 3;

        byte[] inArray = new byte[arr_len];
        byte[] outArray = new byte[arr_len];
        random.nextBytes(inArray);

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
        typeBuilder.setX(w).setY(h).setZ(d);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_3D_Padded_Byte Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Short3_1D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        short[] inArray = new short[arr_len];
        short[] outArray = new short[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = (short)random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_1D_Padded_Short Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Short3_2D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);
        int height = random.nextInt(128);
        int arr_len = width * height * 3;
        
        short[] inArray = new short[arr_len];
        short[] outArray = new short[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = (short)random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
        typeBuilder.setX(width).setY(height);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_2D_Padded_Short Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Short3_3D() {
        Random random = new Random(0x172d8ab9);
        int w = random.nextInt(32);
        int h = random.nextInt(32);
        int d = random.nextInt(32);
        int arr_len = w * d * h * 3;

        short[] inArray = new short[arr_len];
        short[] outArray = new short[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = (short)random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
        typeBuilder.setX(w).setY(h).setZ(d);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_3D_Padded_Short Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Int3_1D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        int[] inArray = new int[arr_len];
        int[] outArray = new int[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_1D_Padded_Int Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Int3_2D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);
        int height = random.nextInt(128);
        int arr_len = width * height * 3;
        
        int[] inArray = new int[arr_len];
        int[] outArray = new int[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
        typeBuilder.setX(width).setY(height);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_2D_Padded_Int Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Int3_3D() {
        Random random = new Random(0x172d8ab9);
        int w = random.nextInt(32);
        int h = random.nextInt(32);
        int d = random.nextInt(32);
        int arr_len = w * d * h * 3;

        int[] inArray = new int[arr_len];
        int[] outArray = new int[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
        typeBuilder.setX(w).setY(h).setZ(d);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_3D_Padded_Int Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Float3_1D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        float[] inArray = new float[arr_len];
        float[] outArray = new float[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextFloat();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_1D_Padded_Float Failed, output array does not match input",
                   result);
    }
    public void test_AllocationPadded_Float3_2D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);
        int height = random.nextInt(128);
        int arr_len = width * height * 3;

        float[] inArray = new float[arr_len];
        float[] outArray = new float[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextFloat();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
        typeBuilder.setX(width).setY(height);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_2D_Padded_Float Failed, output array does not match input",
                   result);
    }
    public void test_AllocationPadded_Float3_3D() {
        Random random = new Random(0x172d8ab9);
        int w = random.nextInt(32);
        int h = random.nextInt(32);
        int d = random.nextInt(32);
        int arr_len = w * d * h * 3;

        float[] inArray = new float[arr_len];
        float[] outArray = new float[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextFloat();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
        typeBuilder.setX(w).setY(h).setZ(d);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_3D_Padded_Float Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Double3_1D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        double[] inArray = new double[arr_len];
        double[] outArray = new double[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = (double)random.nextFloat();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F64_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_1D_Padded_Double Failed, output array does not match input",
                   result);
    }
    public void test_AllocationPadded_Double3_2D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);
        int height = random.nextInt(128);
        int arr_len = width * height * 3;

        double[] inArray = new double[arr_len];
        double[] outArray = new double[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = (double)random.nextFloat();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F64_3(mRS));
        typeBuilder.setX(width).setY(height);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_2D_Padded_Double Failed, output array does not match input",
                   result);
    }
    public void test_AllocationPadded_Double3_3D() {
        Random random = new Random(0x172d8ab9);
        int w = random.nextInt(32);
        int h = random.nextInt(32);
        int d = random.nextInt(32);
        int arr_len = w * d * h * 3;

        double[] inArray = new double[arr_len];
        double[] outArray = new double[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = (double)random.nextFloat();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F64_3(mRS));
        typeBuilder.setX(w).setY(h).setZ(d);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_3D_Padded_Double Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Long3_1D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        long[] inArray = new long[arr_len];
        long[] outArray = new long[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextLong();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_1D_Padded_Long Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Long3_2D() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);
        int height = random.nextInt(128);
        int arr_len = width * height * 3;
        
        long[] inArray = new long[arr_len];
        long[] outArray = new long[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextLong();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
        typeBuilder.setX(width).setY(height);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_2D_Padded_Long Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_Long3_3D() {
        Random random = new Random(0x172d8ab9);
        int w = random.nextInt(32);
        int h = random.nextInt(32);
        int d = random.nextInt(32);
        int arr_len = w * d * h * 3;

        long[] inArray = new long[arr_len];
        long[] outArray = new long[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextLong();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
        typeBuilder.setX(w).setY(h).setZ(d);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copyFrom(inArray);
        alloc.copyTo(outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_AllocationCopyTo_3D_Padded_Long Failed, output array does not match input",
                   result);
    }


    public void test_AllocationPadded_copy1DRangeTo_Byte3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        byte[] inArray = new byte[arr_len];
        byte[] outArray = new byte[arr_len];
        random.nextBytes(inArray);

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        int offset = random.nextInt(width);
        int count = width - offset;
        alloc.copy1DRangeFrom(offset, count, inArray);
        alloc.copy1DRangeTo(offset, count, outArray);

        boolean result = true;
        for (int i = 0; i < count * 3; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        for (int i = count * 3; i < arr_len; i++) {
            if (outArray[i] != 0) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy1DRangeTo_Padded_Byte Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy1DRangeTo_Short3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        short[] inArray = new short[arr_len];
        short[] outArray = new short[arr_len];
        
        for (int i = 0; i < arr_len; i++) {
            inArray[i] = (short)random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        int offset = random.nextInt(width);
        int count = width - offset;
        alloc.copy1DRangeFrom(offset, count, inArray);
        alloc.copy1DRangeTo(offset, count, outArray);

        boolean result = true;
        for (int i = 0; i < count * 3; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        for (int i = count * 3; i < arr_len; i++) {
            if (outArray[i] != 0) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy1DRangeTo_Padded_Short Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy1DRangeTo_Int3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        int[] inArray = new int[arr_len];
        int[] outArray = new int[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        int offset = random.nextInt(width);
        int count = width - offset;
        alloc.copy1DRangeFrom(offset, count, inArray);
        alloc.copy1DRangeTo(offset, count, outArray);

        boolean result = true;
        for (int i = 0; i < count * 3; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        for (int i = count * 3; i < arr_len; i++) {
            if (outArray[i] != 0) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy1DRangeTo_Padded_Int Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy1DRangeTo_Float3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        float[] inArray = new float[arr_len];
        float[] outArray = new float[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextFloat();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        int offset = random.nextInt(width);
        int count = width - offset;
        alloc.copy1DRangeFrom(offset, count, inArray);
        alloc.copy1DRangeTo(offset, count, outArray);

        boolean result = true;
        for (int i = 0; i < count * 3; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        for (int i = count * 3; i < arr_len; i++) {
            if (outArray[i] != 0f) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy1DRangeTo_Padded_Float Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy1DRangeTo_Long3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        long[] inArray = new long[arr_len];
        long[] outArray = new long[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextLong();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        int offset = random.nextInt(width);
        int count = width - offset;
        alloc.copy1DRangeFrom(offset, count, inArray);
        alloc.copy1DRangeTo(offset, count, outArray);

        boolean result = true;
        for (int i = 0; i < count * 3; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        for (int i = count * 3; i < arr_len; i++) {
            if (outArray[i] != 0) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy1DRangeTo_Padded_Long Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy2DRangeTo_Byte3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);
        int height = random.nextInt(128);
        int xoff = random.nextInt(width);
        int yoff = random.nextInt(height);
        int xcount = width - xoff;
        int ycount = height - yoff;
        int arr_len = xcount * ycount * 3;

        byte[] inArray = new byte[arr_len];
        byte[] outArray = new byte[arr_len];
        random.nextBytes(inArray);

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
        typeBuilder.setX(width).setY(height);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy2DRangeTo_Padded_Byte Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy2DRangeTo_Short3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);
        int height = random.nextInt(128);
        int xoff = random.nextInt(width);
        int yoff = random.nextInt(height);
        int xcount = width - xoff;
        int ycount = height - yoff;
        int arr_len = xcount * ycount * 3;

        short[] inArray = new short[arr_len];
        short[] outArray = new short[arr_len];
        
        for (int i = 0; i < arr_len; i++) {
            inArray[i] = (short)random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
        typeBuilder.setX(width).setY(height);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy2DRangeTo_Padded_Short Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy2DRangeTo_Int3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);
        int height = random.nextInt(128);
        int xoff = random.nextInt(width);
        int yoff = random.nextInt(height);
        int xcount = width - xoff;
        int ycount = height - yoff;
        int arr_len = xcount * ycount * 3;

        int[] inArray = new int[arr_len];
        int[] outArray = new int[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
        typeBuilder.setX(width).setY(height);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy2DRangeTo_Padded_Int Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy2DRangeTo_Float3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);
        int height = random.nextInt(128);
        int xoff = random.nextInt(width);
        int yoff = random.nextInt(height);
        int xcount = width - xoff;
        int ycount = height - yoff;
        int arr_len = xcount * ycount * 3;

        float[] inArray = new float[arr_len];
        float[] outArray = new float[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextFloat();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
        typeBuilder.setX(width).setY(height);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy2DRangeTo_Padded_Float Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy2DRangeTo_Long3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(128);
        int height = random.nextInt(128);
        int xoff = random.nextInt(width);
        int yoff = random.nextInt(height);
        int xcount = width - xoff;
        int ycount = height - yoff;
        int arr_len = xcount * ycount * 3;

        long[] inArray = new long[arr_len];
        long[] outArray = new long[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextLong();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
        typeBuilder.setX(width).setY(height);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);

        boolean result = true;
        for (int i = 0; i < arr_len; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy2DRangeTo_Padded_Long Failed, output array does not match input",
                   result);
    }


    public void test_AllocationPadded_copy1DRangeToUnchecked_Byte3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        byte[] inArray = new byte[arr_len];
        byte[] outArray = new byte[arr_len];
        random.nextBytes(inArray);

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        int offset = random.nextInt(width);
        int count = width - offset;
        alloc.copy1DRangeFrom(offset, count, inArray);
        alloc.copy1DRangeToUnchecked(offset, count, outArray);

        boolean result = true;
        for (int i = 0; i < count * 3; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        for (int i = count * 3; i < arr_len; i++) {
            if (outArray[i] != 0) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy1DRangeToUnchecked_Padded_Byte Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy1DRangeToUnchecked_Short3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        short[] inArray = new short[arr_len];
        short[] outArray = new short[arr_len];
        
        for (int i = 0; i < arr_len; i++) {
            inArray[i] = (short)random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        int offset = random.nextInt(width);
        int count = width - offset;
        alloc.copy1DRangeFrom(offset, count, inArray);
        alloc.copy1DRangeToUnchecked(offset, count, outArray);

        boolean result = true;
        for (int i = 0; i < count * 3; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        for (int i = count * 3; i < arr_len; i++) {
            if (outArray[i] != 0) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy1DRangeToUnchecked_Padded_Short Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy1DRangeToUnchecked_Int3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        int[] inArray = new int[arr_len];
        int[] outArray = new int[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextInt();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        int offset = random.nextInt(width);
        int count = width - offset;
        alloc.copy1DRangeFrom(offset, count, inArray);
        alloc.copy1DRangeToUnchecked(offset, count, outArray);

        boolean result = true;
        for (int i = 0; i < count * 3; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        for (int i = count * 3; i < arr_len; i++) {
            if (outArray[i] != 0) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy1DRangeToUnchecked_1D_Padded_Int Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy1DRangeToUnchecked_Float3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        float[] inArray = new float[arr_len];
        float[] outArray = new float[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextFloat();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        int offset = random.nextInt(width);
        int count = width - offset;
        alloc.copy1DRangeFrom(offset, count, inArray);
        alloc.copy1DRangeToUnchecked(offset, count, outArray);

        boolean result = true;
        for (int i = 0; i < count * 3; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        for (int i = count * 3; i < arr_len; i++) {
            if (outArray[i] != 0f) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy1DRangeToUnchecked_Padded_Float Failed, output array does not match input",
                   result);
    }

    public void test_AllocationPadded_copy1DRangeToUnchecked_Long3() {
        Random random = new Random(0x172d8ab9);
        int width = random.nextInt(512);
        int arr_len = width * 3;

        long[] inArray = new long[arr_len];
        long[] outArray = new long[arr_len];

        for (int i = 0; i < arr_len; i++) {
            inArray[i] = random.nextLong();
        }

        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
        typeBuilder.setX(width);
        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
        alloc.setAutoPadding(true);
        int offset = random.nextInt(width);
        int count = width - offset;
        alloc.copy1DRangeFrom(offset, count, inArray);
        alloc.copy1DRangeToUnchecked(offset, count, outArray);

        boolean result = true;
        for (int i = 0; i < count * 3; i++) {
            if (inArray[i] != outArray[i]) {
                result = false;
                break;
            }
        }
        for (int i = count * 3; i < arr_len; i++) {
            if (outArray[i] != 0) {
                result = false;
                break;
            }
        }
        assertTrue("test_copy1DRangeToUnchecked_Padded_Long Failed, output array does not match input",
                   result);
    }
}
