/* * Copyright (C) 2022 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 com.android.net.module.util import com.android.net.module.util.BitUtils.appendStringRepresentationOfBitMaskToStringBuilder import com.android.net.module.util.BitUtils.describeDifferences import com.android.net.module.util.BitUtils.packBits import com.android.net.module.util.BitUtils.unpackBits import kotlin.test.assertEquals import kotlin.test.assertNull import kotlin.test.assertTrue import org.junit.Test class BitUtilsTests { @Test fun testBitPackingTestCase() { runBitPackingTestCase(0, intArrayOf()) runBitPackingTestCase(1, intArrayOf(0)) runBitPackingTestCase(3, intArrayOf(0, 1)) runBitPackingTestCase(4, intArrayOf(2)) runBitPackingTestCase(63, intArrayOf(0, 1, 2, 3, 4, 5)) runBitPackingTestCase(Long.MAX_VALUE.inv(), intArrayOf(63)) runBitPackingTestCase(Long.MAX_VALUE.inv() + 1, intArrayOf(0, 63)) runBitPackingTestCase(Long.MAX_VALUE.inv() + 2, intArrayOf(1, 63)) } fun runBitPackingTestCase(packedBits: Long, bits: IntArray) { assertEquals(packedBits, packBits(bits)) assertTrue(bits contentEquals unpackBits(packedBits)) } @Test fun testAppendStringRepresentationOfBitMaskToStringBuilder() { runTestAppendStringRepresentationOfBitMaskToStringBuilder("", 0) runTestAppendStringRepresentationOfBitMaskToStringBuilder("BIT0", 0b1) runTestAppendStringRepresentationOfBitMaskToStringBuilder("BIT1&BIT2&BIT4", 0b10110) runTestAppendStringRepresentationOfBitMaskToStringBuilder( "BIT0&BIT60&BIT61&BIT62&BIT63", (0b11110000_00000000_00000000_00000000 shl 32) + 0b00000000_00000000_00000000_00000001) } fun runTestAppendStringRepresentationOfBitMaskToStringBuilder(expected: String, bitMask: Long) { StringBuilder().let { appendStringRepresentationOfBitMaskToStringBuilder(it, bitMask, { i -> "BIT$i" }, "&") assertEquals(expected, it.toString()) } } @Test fun testDescribeDifferences() { fun describe(a: Long, b: Long) = describeDifferences(a, b, Integer::toString) assertNull(describe(0, 0)) assertNull(describe(5, 5)) assertNull(describe(Long.MAX_VALUE, Long.MAX_VALUE)) assertEquals("+0", describe(0, 1)) assertEquals("-0", describe(1, 0)) assertEquals("+0+2", describe(0, 5)) assertEquals("+2", describe(1, 5)) assertEquals("-0+2", describe(1, 4)) fun makeField(vararg i: Int) = i.sumOf { 1L shl it } assertEquals("-0-4-6-9+1+3+11", describe(makeField(0, 4, 6, 9), makeField(1, 3, 11))) assertEquals("-1-5-9+6+8", describe(makeField(0, 1, 3, 4, 5, 9), makeField(0, 3, 4, 6, 8))) } }