/* __ *\ ** ________ ___ / / ___ __ ____ Scala.js Test Suite ** ** / __/ __// _ | / / / _ | __ / // __/ (c) 2013, LAMP/EPFL ** ** __\ \/ /__/ __ |/ /__/ __ |/_// /_\ \ http://scala-js.org/ ** ** /____/\___/_/ |_/____/_/ | |__/ /____/ ** ** |/____/ ** \* */ package scala.scalajs.testsuite.javalib import org.scalajs.jasminetest.JasmineTest import java.util.Random import scala.scalajs.js import scala.scalajs.js.JSConverters._ object RandomTest extends JasmineTest { describe("java.util.Random") { it("should produce bits according to spec with seed=10") { val random = new HackRandom(10) expect(random.next(10)).toBe(747) expect(random.next(1)).toBe(0) expect(random.next(6)).toBe(16) expect(random.next(20)).toBe(432970) expect(random.next(32)).toBe(254270492) } it("should produce bits according to spec with seed=-5") { val random = new HackRandom(-5) expect(random.next(10)).toBe(275) expect(random.next(1)).toBe(0) expect(random.next(6)).toBe(21) expect(random.next(20)).toBe(360349) expect(random.next(32)).toBe(1635930704) } it("should produce bits according to spec with seed=MaxLong") { val random = new HackRandom(Long.MaxValue) expect(random.next(10)).toBe(275) expect(random.next(1)).toBe(0) expect(random.next(6)).toBe(0) expect(random.next(20)).toBe(574655) expect(random.next(32)).toBe(-1451336087) } it("should produce bits according to spec with seed=MinInt") { val random = new HackRandom(Int.MinValue) expect(random.next(10)).toBe(388) expect(random.next(1)).toBe(0) expect(random.next(6)).toBe(25) expect(random.next(20)).toBe(352095) expect(random.next(32)).toBe(-2140124682) } it("should allow resetting the seed") { val random = new HackRandom(11) expect(random.next(10)).toBe(747) expect(random.next(1)).toBe(1) expect(random.next(6)).toBe(27) random.setSeed(11) expect(random.next(10)).toBe(747) expect(random.next(1)).toBe(1) expect(random.next(6)).toBe(27) } it("should reset nextNextGaussian when setting the seed") { val random = new Random(-1) expect(random.nextGaussian()).toBe(1.7853314409882288) random.setSeed(-1) expect(random.nextGaussian()).toBe(1.7853314409882288) } it("should correctly implement nextDouble") { val random = new Random(-45) expect(random.nextDouble()).toBe(0.27288421395636253) expect(random.nextDouble()).toBe(0.5523165360074201) expect(random.nextDouble()).toBe(0.5689979434708298) expect(random.nextDouble()).toBe(0.9961166166874871) expect(random.nextDouble()).toBe(0.5368984665202684) expect(random.nextDouble()).toBe(0.19849067496547423) expect(random.nextDouble()).toBe(0.6021019223595357) expect(random.nextDouble()).toBe(0.06132131151816378) expect(random.nextDouble()).toBe(0.7303867762743866) expect(random.nextDouble()).toBe(0.7426529384056163) } it("should correctly implement nextBoolean") { val random = new Random(4782934) expect(random.nextBoolean()).toBe(false) expect(random.nextBoolean()).toBe(true) expect(random.nextBoolean()).toBe(true) expect(random.nextBoolean()).toBe(false) expect(random.nextBoolean()).toBe(false) expect(random.nextBoolean()).toBe(false) expect(random.nextBoolean()).toBe(true) expect(random.nextBoolean()).toBe(false) } it("should correctly implement nextInt") { val random = new Random(-84638) expect(random.nextInt()).toBe(-1217585344) expect(random.nextInt()).toBe(1665699216) expect(random.nextInt()).toBe(382013296) expect(random.nextInt()).toBe(1604432482) expect(random.nextInt()).toBe(-1689010196) expect(random.nextInt()).toBe(1743354032) expect(random.nextInt()).toBe(454046816) expect(random.nextInt()).toBe(922172344) expect(random.nextInt()).toBe(-1890515287) expect(random.nextInt()).toBe(1397525728) } it("should correctly implement nextInt(n)") { val random = new Random(7) expect(random.nextInt(76543)).toBe(32736) expect(() => random.nextInt(0)).toThrow expect(random.nextInt(45)).toBe(29) expect(random.nextInt(945)).toBe(60) expect(random.nextInt(35694839)).toBe(20678044) expect(random.nextInt(35699)).toBe(23932) expect(random.nextInt(3699)).toBe(2278) expect(random.nextInt(10)).toBe(8) } it("should correctly implement nextInt(n) for powers of 2") { val random = new Random(-56938) expect(random.nextInt(32)).toBe(8) expect(random.nextInt(8)).toBe(3) expect(random.nextInt(128)).toBe(3) expect(random.nextInt(4096)).toBe(1950) expect(random.nextInt(8192)).toBe(3706) expect(random.nextInt(8192)).toBe(4308) expect(random.nextInt(8192)).toBe(3235) expect(random.nextInt(8192)).toBe(7077) expect(random.nextInt(8192)).toBe(2392) expect(random.nextInt(32)).toBe(31) } it("should correctly implement nextLong") { val random = new Random(205620432625028L) expect(random.nextLong()).toBe(3710537363280377478L) expect(random.nextLong()).toBe(4121778334981170700L) expect(random.nextLong()).toBe(289540773990891960L) expect(random.nextLong()).toBe(307008980197674441L) expect(random.nextLong()).toBe(7527069864796025013L) expect(random.nextLong()).toBe(-4563192874520002144L) expect(random.nextLong()).toBe(7619507045427546529L) expect(random.nextLong()).toBe(-7888117030898487184L) expect(random.nextLong()).toBe(-3499168703537933266L) expect(random.nextLong()).toBe(-1998975913933474L) } it("should correctly implement nextFloat") { val random = new Random(-3920005825473L) expect(random.nextFloat()).toBeCloseTo(0.059591234, 7) expect(random.nextFloat()).toBeCloseTo(0.7007871, 7) expect(random.nextFloat()).toBeCloseTo(0.39173192, 7) expect(random.nextFloat()).toBeCloseTo(0.0647918, 7) expect(random.nextFloat()).toBeCloseTo(0.9029677, 7) expect(random.nextFloat()).toBeCloseTo(0.18226051, 7) expect(random.nextFloat()).toBeCloseTo(0.94444054, 7) expect(random.nextFloat()).toBeCloseTo(0.008844078, 7) expect(random.nextFloat()).toBeCloseTo(0.08891684, 7) expect(random.nextFloat()).toBeCloseTo(0.06482434, 7) } it("should correctly implement nextBytes") { val random = new Random(7399572013373333L) def test(exps: Int*) = { val exp = js.Array(exps.map(_.toByte): _*) val buf = new Array[Byte](exp.length) random.nextBytes(buf) expect(buf.toJSArray).toEqual(exp) } test(62, 89, 68, -91, 10, 0, 85) test(-89, -76, 88, 121, -25, 47, 58, -8, 78, 20, -77, 84, -3, -33, 58, -9, 11, 57, -118, 40, -74, -86, 78, 123, 58) test(-77, 112, -116) test() test(-84, -96, 108) test(57, -106, 42, -100, -47, -84, 67, -48, 45) } it("should correctly implement nextGaussian") { val random = new Random(2446004) expect(random.nextGaussian()).toBe(-0.5043346938630431) expect(random.nextGaussian()).toBe(-0.3250983270156675) expect(random.nextGaussian()).toBe(-0.23799457294994966) expect(random.nextGaussian()).toBe(0.4164610631507695) expect(random.nextGaussian()).toBe(0.22086348814760687) expect(random.nextGaussian()).toBe(-0.706833209972521) expect(random.nextGaussian()).toBe(0.6730758289772553) expect(random.nextGaussian()).toBe(0.2797393696191283) expect(random.nextGaussian()).toBe(-0.2979099632667685) expect(random.nextGaussian()).toBe(0.37443415981434314) expect(random.nextGaussian()).toBe(0.9584801742918951) expect(random.nextGaussian()).toBe(1.1762179112229345) expect(random.nextGaussian()).toBe(0.8736960092848826) expect(random.nextGaussian()).toBe(0.12301554931271008) expect(random.nextGaussian()).toBe(-0.6052081187207353) expect(random.nextGaussian()).toBe(-0.2015925608755316) expect(random.nextGaussian()).toBe(-1.0071216119742104) expect(random.nextGaussian()).toBe(0.6734222041441913) expect(random.nextGaussian()).toBe(0.3990565555091522) expect(random.nextGaussian()).toBe(2.0051627385915154) } } /** Helper class to access next */ class HackRandom(seed: Long) extends Random(seed) { override def next(bits: Int): Int = super.next(bits) } }