summaryrefslogblamecommitdiff
path: root/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/javalib/RandomTest.scala
blob: 1794d4afdd28e1d14b504536b0ee535d5b7957e4 (plain) (tree)
































































































































































































































                                                                          
/*                     __                                               *\
**     ________ ___   / /  ___      __ ____  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)
  }

}