1/* GENERATED SOURCE. DO NOT MODIFY. */
2// © 2016 and later: Unicode, Inc. and others.
3// License & terms of use: http://www.unicode.org/copyright.html#License
4/*
5 ****************************************************************************
6 * Copyright (C) 2004-2010, International Business Machines Corporation and *
7 * others. All Rights Reserved.                                             *
8 ****************************************************************************
9 *
10 */
11
12package android.icu.dev.test.timescale;
13
14import java.util.Random;
15
16import org.junit.Test;
17
18import android.icu.dev.test.TestFmwk;
19import android.icu.math.BigDecimal;
20import android.icu.util.UniversalTimeScale;
21
22/**
23 * This class tests the UniversalTimeScale class by
24 * generating ramdon values in range and making sure
25 * that they round-trip correctly.
26 */
27public class TimeScaleMonkeyTest extends TestFmwk
28{
29
30    /**
31     * The default constructor.
32     */
33    public TimeScaleMonkeyTest()
34    {
35    }
36
37    private static final int LOOP_COUNT = 1000;
38    private static final BigDecimal longMax = new BigDecimal(Long.MAX_VALUE);
39
40    private Random ran = null;
41
42    private long ranInt;
43    private long ranMin;
44    private long ranMax;
45
46    private void initRandom(long min, long max)
47    {
48        BigDecimal interval = new BigDecimal(max).subtract(new BigDecimal(min));
49
50        ranMin = min;
51        ranMax = max;
52        ranInt = 0;
53
54        if (ran == null) {
55            ran = createRandom();
56        }
57
58        if (interval.compareTo(longMax) < 0) {
59            ranInt = interval.longValue();
60        }
61    }
62
63    private final long randomInRange()
64    {
65        long value;
66
67        if (ranInt != 0) {
68            value = ran.nextLong() % ranInt;
69
70            if (value < 0) {
71                value = -value;
72            }
73
74            value += ranMin;
75        } else {
76            do {
77                value = ran.nextLong();
78            } while (value < ranMin || value > ranMax);
79        }
80
81        return value;
82    }
83
84    @Test
85    public void TestRoundTrip()
86    {
87        for (int scale = 0; scale < UniversalTimeScale.MAX_SCALE; scale += 1) {
88            long fromMin = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.FROM_MIN_VALUE);
89            long fromMax = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.FROM_MAX_VALUE);
90            int i = 0;
91
92            initRandom(fromMin, fromMax);
93
94            while (i < LOOP_COUNT) {
95                long value = randomInRange();
96
97                long rt = UniversalTimeScale.toLong(UniversalTimeScale.from(value, scale), scale);
98
99                if (rt != value) {
100                    errln("Round-trip error: time scale = " + scale + ", value = " + value + ", round-trip = " + rt);
101                }
102
103                i += 1;
104            }
105        }
106    }
107}
108