library inflection3.plural.test;

import 'package:inflection3/inflection3.dart';
import 'package:inflection3/src/uncountable_nouns.dart';
import 'package:test/test.dart';

void main() {
  group('The PluralEncoder', () {
    test('converts nouns from singular to plural', () {
      expect(PLURAL.convert(''), equals(''));
      expect(PLURAL.convert('House'), equals('Houses'));
      expect(PLURAL.convert('house'), equals('houses'));
      expect(PLURAL.convert('dog'), equals('dogs'));
      expect(PLURAL.convert('axis'), equals('axes'));
      expect(PLURAL.convert('testis'), equals('testes'));
      expect(PLURAL.convert('octopus'), equals('octopi'));
      expect(PLURAL.convert('virus'), equals('viri'));
      expect(PLURAL.convert('octopi'), equals('octopi'));
      expect(PLURAL.convert('viri'), equals('viri'));
      expect(PLURAL.convert('alias'), equals('aliases'));
      expect(PLURAL.convert('status'), equals('statuses'));
      expect(PLURAL.convert('bus'), equals('buses'));
      expect(PLURAL.convert('buffalo'), equals('buffaloes'));
      expect(PLURAL.convert('tomato'), equals('tomatoes'));
      expect(PLURAL.convert('ultimatum'), equals('ultimata'));
      expect(PLURAL.convert('pentium'), equals('pentia'));
      expect(PLURAL.convert('ultimata'), equals('ultimata'));
      expect(PLURAL.convert('pentia'), equals('pentia'));
      expect(PLURAL.convert('nemesis'), equals('nemeses'));
      expect(PLURAL.convert('hive'), equals('hives'));
      expect(PLURAL.convert('fly'), equals('flies'));
      expect(PLURAL.convert('dish'), equals('dishes'));
      expect(PLURAL.convert('bench'), equals('benches'));
      expect(PLURAL.convert('matrix'), equals('matrices'));
      expect(PLURAL.convert('vertex'), equals('vertices'));
      expect(PLURAL.convert('index'), equals('indices'));
      expect(PLURAL.convert('mouse'), equals('mice'));
      expect(PLURAL.convert('louse'), equals('lice'));
      expect(PLURAL.convert('mice'), equals('mice'));
      expect(PLURAL.convert('lice'), equals('lice'));
      expect(PLURAL.convert('ox'), equals('oxen'));
      expect(PLURAL.convert('ox'), equals('oxen'));
      expect(PLURAL.convert('oxen'), equals('oxen'));
      expect(PLURAL.convert('quiz'), equals('quizzes'));
    });

    test('handles uncountable nouns', () {
      uncountableNouns.forEach((noun) {
        expect(PLURAL.convert(noun), equals(noun));
      });

      uncountableNouns.forEach((noun) {
        final upperNoun = noun.toUpperCase();
        expect(PLURAL.convert(upperNoun), equals(upperNoun));
      });
    });

    test('handles irregular plural nouns', () {
      expect(PLURAL.convert('person'), equals('people'));
      expect(PLURAL.convert('Child'), equals('Children'));
      expect(PLURAL.convert('children'), equals('children'));
      expect(PLURAL.convert('man'), equals('men'));
    });
  });
}