/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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 groovy

import org.junit.jupiter.api.Test


class PrimitiveArraysTest {

    def c1Field = [] as char[]
    char[] c2Field = [] as char[]

    def i1Field = [] as int[]
    int[] i2Field = [] as int[]

    def d1Field = [] as double[]
    double[] d2Field = [] as double[]

    def f1Field = [] as float[]
    float[] f2Field = [] as float[]

    def l1Field = [] as long[]
    long[] l2Field = [] as long[]

    def b1Field = [] as byte[]
    byte[] b2Field = [] as byte[]

    def s1Field = [] as short[]
    short[] s2Field = [] as short[]

    @Test
    void testChar() {
        assert c1Field.class == c2Field.class
        def ca = ['l','l'] as char[]
        char[] cb = ['l','l']
        assert ca.class == cb.class
        assert c1Field.class == ca.class
        assert ca.class.name == "[C"

        ca.each{ assert it=='l' }
        cb.each{ assert it=='l' }
    }


    @Test
    void testInt() {
        assert i1Field.class == i2Field.class
        def ia = [1,1] as int[]
        int[] ib = [1,1]
        assert ia.class == ib.class
        assert i1Field.class == ia.class
        assert ia.class.name == "[I"

        ia.each{ assert it==1 }
        ib.each{ assert it==1 }
    }


    @Test
    void testLong() {
        assert l1Field.class == l2Field.class
        def la = [1,1] as long[]
        long[] lb = [1,1]
        assert la.class == lb.class
        assert l1Field.class == la.class
        assert la.class.name == "[J"

        la.each{ assert it==1l }
        lb.each{ assert it==1l }
    }


    @Test
    void testShort() {
        assert s1Field.class == s2Field.class
        def sa = [1,1] as short[]
        short[] sb = [1,1]
        assert sa.class == sb.class
        assert s1Field.class == sa.class
        assert sa.class.name == "[S"

        sa.each{ assert it==1 }
        sb.each{ assert it==1 }
    }

    @Test
    void testByte() {
        assert b1Field.class == b2Field.class
        def ba = [1,1] as byte[]
        byte[] bb = [1,1]
        assert ba.class == bb.class
        assert b1Field.class == ba.class
        assert ba.class.name == "[B"

        ba.each{ assert it==1 }
        bb.each{ assert it==1 }
    }


    @Test
    void testDouble() {
        assert d1Field.class == d2Field.class
        def da = [1,1] as double[]
        double[] db = [1,1]
        assert da.class == db.class
        assert d1Field.class == da.class
        assert da.class.name == "[D"

        da.each{ assert it==1.0d }
        db.each{ assert it==1.0d }
    }

    @Test
    void testFloat() {
        assert f1Field.class == f2Field.class
        def fa = [1,1] as float[]
        float[] fb = [1,1]
        assert fa.class == fb.class
        assert f1Field.class == fa.class
        assert fa.class.name == "[F"

        fa.each{ assert it==1.0f }
        fb.each{ assert it==1.0f }
    }

    @Test
    void testBoolean() {
      def ba = new boolean[1][2][3]
      assert ba[0].length == 2
      assert ba[0][0].length == 3
      ba = [true,true] as boolean[]
      ba.each { assert it==true }
      assert ba.class.name == "[Z"
    }

}