// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/// Test plurals without translation.
///
/// This exercises the plural selection rules. We aren't worried about the text,
/// just that it picks the right phrase for the right number.

library plural_test;

import 'package:intl/intl.dart';
import 'package:test/test.dart';

/// Hard-coded expected values for a Russian plural rule.
///
/// Note that the way I'm interpreting this is that if there's a case for zero,
/// one or two and the number is exactly that, then use that value. Otherwise we
/// use One for the singular, Few for the genitive singular, and Many for the
/// genitive plural. Other would be used for fractional values if we supported
/// those.
var expectedRu = '''
0:Zero
1:One
2:Few
3:Few
4:Few
5:Many
6:Many
7:Many
8:Many
9:Many
10:Many
11:Many
12:Many
13:Many
14:Many
15:Many
16:Many
17:Many
18:Many
19:Many
20:Many
21:One
22:Few
23:Few
24:Few
25:Many
26:Many
27:Many
28:Many
29:Many
30:Many
31:One
32:Few
59:Many
60:Many
61:One
62:Few
63:Few
64:Few
65:Many
66:Many
67:Many
68:Many
69:Many
70:Many
71:One
72:Few
100:Many
101:One
102:Few
103:Few
104:Few
105:Many
106:Many
107:Many
108:Many
109:Many
110:Many
111:Many
112:Many
113:Many
114:Many
115:Many
116:Many
117:Many
118:Many
119:Many
120:Many
121:One
122:Few
129:Many
130:Many
131:One
132:Few
139:Many
140:Many
141:One
142:Few
143:Few
144:Few
145:Many
''';

var expectedEn = '''
0:Zero
1:One
2:Other
3:Other
4:Other
5:Other
6:Other
7:Other
8:Other
9:Other
10:Other
11:Other
12:Other
13:Other
14:Other
15:Other
16:Other
17:Other
18:Other
19:Other
20:Other
21:Other
22:Other
145:Other
''';

var expectedRo = '''
0:Few
1:One
2:Few
12:Few
23:Other
1212:Few
1223:Other
''';

var expectedSr = '''
0:Other
1:One
31:One
3:Few
33:Few
5:Other
10:Other
35:Other
37:Other
40:Other
2:Few
20:Other
21:One
22:Few
23:Few
24:Few
25:Other
''';

plural(n, locale) => Intl.plural(n,
    locale: locale,
    name: 'plural',
    desc: 'A simple plural test case',
    examples: {'n': 1},
    args: [n],
    zero: '$n:Zero',
    one: '$n:One',
    few: '$n:Few',
    many: '$n:Many',
    other: '$n:Other');

pluralNoZero(n, locale) => Intl.plural(n,
    locale: locale,
    name: 'plural',
    desc: 'A simple plural test case',
    examples: {'n': 1},
    args: [n],
    one: '$n:One',
    few: '$n:Few',
    many: '$n:Many',
    other: '$n:Other');

main() {
  verify(expectedRu, 'ru', plural);
  verify(expectedRu, 'ru_RU', plural);
  verify(expectedEn, 'en', plural);
  verify(expectedRo, 'ro', pluralNoZero);
  verify(expectedSr, 'sr', pluralNoZero);

  test("Check null howMany", () {
    expect(plural(0, null), "0:Zero");
    expect(() => plural(null, null), throwsArgumentError);
    expect(() => plural(null, "ru"), throwsArgumentError);
  });
}

verify(String expectedValues, String locale, pluralFunction) {
  var lines = expectedValues.split('\n').where((x) => x.isNotEmpty).toList();
  for (var i = 0; i < lines.length; i++) {
    test(lines[i], () {
      var number = int.parse(lines[i].split(':').first);
      expect(pluralFunction(number, locale), lines[i]);
    });
  }
}
