blob: 1eb6242a7743062334137adba55167cfd3b775b2 [file] [log] [blame]
/*
* 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 org.apache.commons.rng.core.source32;
import org.apache.commons.rng.core.RandomAssert;
import org.junit.Test;
public class XoShiRo128StarStarTest {
/** The size of the array seed. */
private static final int SEED_SIZE = 4;
/*
* Data from running the executable compiled from the author's C code:
* http://xoshiro.di.unimi.it/xoshiro128starstar.c
*/
private static final int[] SEED = {
0x012de1ba, 0xa5a818b8, 0xb124ea2b, 0x18e03749,
};
private static final int[] EXPECTED_SEQUENCE = {
0x8856d912, 0xf2a19a86, 0x7693f66d, 0x23516f86,
0x4895054e, 0xf4503fe6, 0x40e04672, 0x99244e34,
0xb971815c, 0x3008b82c, 0x0ee73b58, 0x88aad2c6,
0x7923f2e9, 0xfde55485, 0x7aed95f5, 0xeb8abb59,
0xca78183a, 0x80ecdd68, 0xfd404b06, 0x248b9c9e,
0xa2c69c6f, 0x1723b375, 0x879f37b0, 0xe98fd208,
0x75de84a9, 0x717d6df8, 0x92cd7bc7, 0x46380167,
0x7f08600b, 0x58566f2b, 0x7f781475, 0xe34ec04d,
0x6d5ef889, 0xb76ff6d8, 0x501f5df6, 0x4cf70ccb,
0xd7375b26, 0x457ea1ab, 0x7439e565, 0x355855af,
};
private static final int[] EXPECTED_SEQUENCE_AFTER_JUMP = {
0xab597786, 0x9e11647e, 0x147c0f8e, 0xfe86b079,
0x8cda108b, 0x461f24ad, 0x00204529, 0xdfa240cf,
0xcc697f88, 0x11a49521, 0x5e6eb377, 0xe7dad980,
0xc522beed, 0x54049c0d, 0x5409c7de, 0x22148129,
0x2d7fc96e, 0x288d7114, 0xfb18c495, 0x689c4e2b,
0xd7219504, 0xb2d81d4d, 0xe66c9680, 0xeec149b3,
0x82fad922, 0x49e59804, 0x7be8f245, 0xbc193d57,
0xa542f0d5, 0x07474d51, 0xff3c7b3d, 0x2eda9beb,
0xca7657a3, 0xcf58554d, 0x5fe25af7, 0x5beb7d19,
0x58339082, 0x6f7ac9ed, 0xf07faa96, 0x7348dcbf,
};
private static final int[] EXPECTED_SEQUENCE_AFTER_LONG_JUMP = {
0x84ea405d, 0xe43ec9b9, 0x7b43546a, 0x5aeca3cb,
0x54ec4005, 0x90511268, 0x63a1d86b, 0x56e93375,
0x64a6fd02, 0x559acfe7, 0xf4f18034, 0x70c3ae88,
0xfc5d0b08, 0xecba359e, 0x00784b22, 0x48627c78,
0xa971ad76, 0x07d938c2, 0x4db234d7, 0xcafbf946,
0x6b716c5d, 0xc0275fc2, 0x158f8407, 0x4e41c342,
0x1480ac03, 0x6932767a, 0x31eed7c1, 0x9cee78df,
0x2c5d98f5, 0x04d1aab9, 0xbd1a4b49, 0xa40820b9,
0x9384d31f, 0x35dab84f, 0xd6067813, 0xa45e9b4e,
0x13ec0f47, 0x1f3df575, 0x358f3a61, 0xf210c90e,
};
@Test
public void testReferenceCode() {
RandomAssert.assertEquals(EXPECTED_SEQUENCE, new XoShiRo128StarStar(SEED));
}
@Test
public void testConstructorWithZeroSeedIsNonFunctional() {
RandomAssert.assertNextIntZeroOutput(new XoShiRo128StarStar(new int[SEED_SIZE]), 2 * SEED_SIZE);
}
@Test
public void testConstructorWithSingleBitSeedIsFunctional() {
RandomAssert.assertIntArrayConstructorWithSingleBitSeedIsFunctional(XoShiRo128StarStar.class, SEED_SIZE);
}
@Test
public void testConstructorWithoutFullLengthSeed() {
// Hit the case when the input seed is self-seeded when not full length
RandomAssert.assertNextLongNonZeroOutput(new XoShiRo128StarStar(new int[] {SEED[0]}),
SEED_SIZE, SEED_SIZE);
}
@Test
public void testElementConstructor() {
final XoShiRo128StarStar rng1 = new XoShiRo128StarStar(SEED);
final XoShiRo128StarStar rng2 = new XoShiRo128StarStar(SEED[0], SEED[1], SEED[2], SEED[3]);
RandomAssert.assertNextIntEquals(SEED.length * 2, rng1, rng2);
}
@Test
public void testJump() {
RandomAssert.assertJumpEquals(EXPECTED_SEQUENCE, EXPECTED_SEQUENCE_AFTER_JUMP, new XoShiRo128StarStar(SEED));
}
@Test
public void testLongJump() {
RandomAssert.assertLongJumpEquals(EXPECTED_SEQUENCE, EXPECTED_SEQUENCE_AFTER_LONG_JUMP, new XoShiRo128StarStar(SEED));
}
}