⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitwiseoperationstest.groovy

📁 Groovy动态语言 运行在JVM中的动态语言 可以方便的处理业务逻辑变化大的业务
💻 GROOVY
字号:
/** 
 * Test Bitwise Operations in Classic/New Groovy
 * 
 * @author Pilho Kim
 * @version $Revision: 3463 $
 */
class BitwiseOperationsTest extends GroovyTestCase {

    void testBitwiseShift() {
        def a = 4
        def b = -4
        assert a << 1 == 8
        assert a << 2 == 16
        assert a >> 1 == 2
        assert a >> 2 == 1
        assert a >>> 1 == 2
        assert a >>> 2 == 1
        assert b << 1 == -8
        assert b << 2 == -16
        assert b >> 1 == -2
        assert b >> 2 == -1
        assert b >>> 1 == 0x7FFFFFFE
        assert b >>> 2 == 0x3FFFFFFF
    }

    void testBitwiseShiftEQUAL() {
        def a = 4
        a <<= 1
        assert a == 8
        a <<= 2
        assert a == 32
        a >>= 1
        assert a == 16
        a >>= 2
        assert a == 4

        def b = -4
        b <<= 1
        assert b == -8
        b <<= 2
        assert b == -32
        b >>= 1
        assert b == -16
        b >>= 2
        assert b == -4

        b = -4
        b >>>= 1
        assert b == 0x7FFFFFFE
        b = -8
        b >>>= 2
        assert b == 0x3FFFFFFE
    }

    void testBitwiseAnd() {

        def a = 13
        assert (a & 3) == 1    // 0x0000000D & 0x00000003
        assert (a & 7) == 5    // 0x0000000D & 0x00000007
        def b = -13
        assert (b & 3) == 3    // 0xFFFFFFF3 & 0x00000003
        assert (b & 7) == 3    // 0xFFFFFFF3 & 0x00000007
    }

    void testBitwiseAndOperatorPrecedence_FAILS() { if (notYetImplemented()) return
        // Oprator Precedence Problem
        // ^, &, | should be prior to ==, <, >, <=, >=
        def a = 13
        assert a & 3 == 1    // 0x0000000D & 0x00000003
        assert a & 7 == 5    // 0x0000000D & 0x00000007
        def b = -13
        assert b & 3 == 3    // 0xFFFFFFF3 & 0x00000003
        assert b & 7 == 3    // 0xFFFFFFF3 & 0x00000007
    }

    void testBitwiseAndEqual() {
        def a = 13
        a &= 3
        assert a == 1    // 0x0000000D & 0x00000003
        a &= 4
        assert a == 0    // 0x00000001 & 0x00000004
        def b = -13
        b &= 3
        assert b == 3    // 0xFFFFFFF3 & 0x00000003
        b &= 7
        assert b == 3    // 0x00000003 & 0x00000007
    }

    void testBitwiseOr() {
        def a = 13
        assert (a | 8) == 13      // 0x0000000D | 0x00000008
        assert (a | 16) == 29     // 0x0000000D | 0x00000010
        def b = -13
        assert (b | 8) == -5      // 0xFFFFFFF3 | 0x00000008
        assert (b | 16) == -13    // 0xFFFFFFF3 | 0x00000010
    }

    void testBitwiseOrOperatorPrecedence_FAILS() { if (notYetImplemented()) return
        // Oprator Precedence Problem
        // ^, &, | should be prior to ==, <, >, <=, >=
        def a = 13
        assert a | 8 == 13      // 0x0000000D | 0x00000008
        assert a | 16 == 29     // 0x0000000D | 0x00000010
        def b = -13
        assert b | 8 == -5      // 0xFFFFFFF3 | 0x00000008
        assert b | 16 == -13    // 0xFFFFFFF3 | 0x00000010
    }

    void testBitwiseOrEqual() {
        def a = 13
        a |= 2
        assert a == 15     // 0x0000000D | 0x00000002
        a |= 16
        assert a == 31     // 0x0000000F | 0x0000001F
        def b = -13
        b |= 8
        assert b == -5     // 0xFFFFFFF3 | 0x00000008
        b |= 1
        assert b == -5     // 0xFFFFFFFB | 0x00000001
    }

    void testBitwiseXor() {
        def a = 13
        assert (a ^ 10) == 7     // 0x0000000D ^ 0x0000000A = 0x000000007
        assert (a ^ 15) == 2     // 0x0000000D ^ 0x0000000F = 0x000000002
        def b = -13
        assert (b ^ 10) == -7    // 0xFFFFFFF3 ^ 0x0000000A = 0xFFFFFFF9
        assert (b ^ 15) == -4    // 0xFFFFFFF3 ^ 0x0000000F = 0xFFFFFFFC
    }
    void testBitwiseXorOperatorPrecedence_FAILS() { if (notYetImplemented()) return
        // Oprator Precedence Problem
        // ^, &, | should be prior to ==, <, >, <=, >=
        def a = 13
        assert a ^ 10 == 7     // 0x0000000D ^ 0x0000000A = 0x000000007
        assert a ^ 15 == 2     // 0x0000000D ^ 0x0000000F = 0x000000002
        def b = -13
        assert b ^ 10 == -7    // 0xFFFFFFF3 ^ 0x0000000A = 0xFFFFFFF9
        assert b ^ 15 == -4    // 0xFFFFFFF3 ^ 0x0000000F = 0xFFFFFFFC
    }

    void testBitwiseXorEqual() {
        def a = 13
        a ^= 8
        assert a == 5      // 0x0000000D ^ 0x00000008 = 0x000000005
        a ^= 16
        assert a == 21     // 0x00000005 ^ 0x00000010 = 0x000000015
        def b = -13
        b ^= 8
        assert b == -5     // 0xFFFFFFF3 ^ 0x00000008 = 0xFFFFFFFB
        b ^= 16
        assert b == -21    // 0xFFFFFFFB ^ 0x00000010 = 0xFFFFFFEB
    }

    void testBitwiseOrInClosure() {
        def c1 = { x, y -> return x | y }
        assert c1(14, 5) == 15          // 0x0000000E | 0x00000005 = 0x0000000F
        assert c1(0x0D, 0xFE) == 255    // 0x0000000D | 0x000000FE = 0x000000FF

        def c2 = { x, y -> return x | y }
        assert c2(14, 5) == 15          // 0x0000000E | 0x00000005 = 0x0000000F
        assert c2(0x0D, 0xFE) == 255    // 0x0000000D | 0x000000FE = 0x000000FF
    }

    void testAmbiguityOfBitwiseOr() {
        def c1 = { x, y -> return x | y }
        assert c1(14, 5) == 15          // 0x0000000E | 0x00000005 = 0x0000000F
        assert c1(0x0D, 0xFE) == 255    // 0x0000000D | 0x000000FE = 0x000000FF

        def c2 = { x, y -> return x | y }
        assert c2(14, 5) == 15          // 0x0000000E | 0x00000005 = 0x0000000F
        assert c2(0x0D, 0xFE) == 255    // 0x0000000D | 0x000000FE = 0x000000FF

        def x = 3
        def y = 5
        c1 = { xx -> return y }         // -> is a closure delimiter
        c2 = { return x & y }        // & is a bitAnd
        def c3 = { return x ^ y }      // & is a bitXor
        def c11 = {
             xx -> return y             // -> is a closure delimiter
        }
        def c12 = {
             return (x | y)            // | is a bitOr
        }
        def c13 = { xx -> return y      // -> is a closure delimiter
        }
        def c14 = {-> return x | y     // last | is a bitOr
        }

        assert c1(null) == 5
        assert c2() == 1
        assert c3() == 6
        assert c11(null) == 5
        assert c12() == 7
        assert c13(null) == 5
        assert c14() == 7

        x = 0x03

        def d1 = { xx -> return xx }      // -> is a closure delimiter
        def d2 = { return x & x }       // & is a bitAnd
        def d3 = { return x ^ x }       // & is a bitXor
        def d11 = {
             xx -> return xx              // -> is a closure delimiter
        }
        def d12 = {
             return (x | x)            // | is a bitOr
        }
        def d13 = {xx -> return xx       // -> is a closure delimiter
        }
        def d14 = {-> return x | x     // last | is a bitOr
        }
        assert d1(0xF0) == 0xF0
        assert d2(0xF0) == 0x03
        assert d3(0xF0) == 0
        assert d11(0xF0) == 0xF0
        assert d12(0xF0) == 0x03
        assert d13(0xF0) == 0xF0
        assert d14() == 0x03
    }

    void testBitwiseNegation() {
        assert ~1 == -2     // ~0x00000001 = 0xFFFFFFFE
        assert ~-1 == 0     // ~0xFFFFFFFF = 0x00000000
        assert ~~5 == 5     // ~~0x00000005 = ~0xFFFFFFFA = 0xFFFFFFF5
        def a = 13
        assert ~a  == -14     // ~0x0000000D = 0xFFFFFFF2
        assert ~~a  == 13     // ~~0x0000000D = ~0xFFFFFFF2 = 0x0000000D
        assert -~a  == 14     // -~0x0000000D = -0xFFFFFFF2 = 0x0000000E
    }

    void testBitwiseNegationType() {
        def x = ~7
        assert x.class == java.lang.Integer

        def y = ~"foo"
        assert y.class == java.util.regex.Pattern

        def z = ~"${x}"
        assert z.class == java.util.regex.Pattern
    }

    void testBitwiseNegationTypeCallFunction() {
        // integer test
        assert neg(2).class == java.lang.Integer
        assert neg(2) instanceof java.lang.Integer
        assert neg(2) == ~2

        // long test
        assert neg(2L).class == java.lang.Long
        assert neg(2L) instanceof java.lang.Long
        assert neg(2L) == ~2

        // BigInteger test
        assert neg(new java.math.BigInteger("2")).class == java.math.BigInteger
        assert neg(new java.math.BigInteger("2")) instanceof java.math.BigInteger
        assert neg(new java.math.BigInteger("2")) == ~2

        // BigInteger test
        assert neg(2G).class == java.math.BigInteger
        assert neg(2G) instanceof java.math.BigInteger
        assert neg(2G) == ~2

        assert neg("foo").class == java.util.regex.Pattern
        assert neg("foo") instanceof java.util.regex.Pattern
    }

    Object neg(n) {
        if (n instanceof java.lang.Integer) {
            return ~n
        }
        else if (n instanceof java.lang.Long) {
            return ~n
        }
        else if (n instanceof java.math.BigInteger) {
            return ~n
        }
        else {
             return ~n.toString()
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -