Skip to content

Commit

Permalink
english support
Browse files Browse the repository at this point in the history
  • Loading branch information
Dorian Sarnowski committed Jun 19, 2015
1 parent ca0c071 commit c19da81
Show file tree
Hide file tree
Showing 17 changed files with 298 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@

import static com.google.common.base.Verify.verifyNotNull;
import static pl.allegro.finance.tradukisto.internal.Container.czechContainer;
import static pl.allegro.finance.tradukisto.internal.Container.englishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.polishContainer;

public enum MoneyConverters {

POLISH_BANKING_MONEY_VALUE(polishContainer().getBankingMoneyConverter()),
CZECH_BANKING_MONEY_VALUE(czechContainer().getBankingMoneyConverter());
CZECH_BANKING_MONEY_VALUE(czechContainer().getBankingMoneyConverter()),
ENGLISH_BANKING_MONEY_VALUE(englishContainer().getBankingMoneyConverter());

private BigDecimalToStringConverter converter;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@

import static com.google.common.base.Verify.verifyNotNull;
import static pl.allegro.finance.tradukisto.internal.Container.czechContainer;
import static pl.allegro.finance.tradukisto.internal.Container.englishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.polishContainer;

public enum ValueConverters {

POLISH_INTEGER(polishContainer().getNumbersConverter()),
CZECH_INTEGER(czechContainer().getNumbersConverter());
CZECH_INTEGER(czechContainer().getNumbersConverter()),
ENGLISH_INTEGER(englishContainer().getNumbersConverter());

private IntegerToStringConverter converter;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ public interface BaseValues {
List<PluralForms> pluralForms();

String currency();

char twoDigitsNumberSeparator();
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import pl.allegro.finance.tradukisto.internal.languages.czech.CzechIntegerToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.czech.CzechValues;
import pl.allegro.finance.tradukisto.internal.languages.czech.CzechValuesForSmallNumbers;
import pl.allegro.finance.tradukisto.internal.languages.english.EnglishValues;
import pl.allegro.finance.tradukisto.internal.languages.polish.PolishValues;

public class Container {
Expand All @@ -29,12 +30,16 @@ public static Container czechContainer() {
return new Container(integerConverter, bigDecimalBankingMoneyValueConverter);
}

private final IntegerToStringConverter integerConverter;
public static Container englishContainer() {
return new Container(new EnglishValues());
}

private final IntegerToStringConverter integerConverter;
private final BigDecimalToStringConverter bigDecimalConverter;

public Container(BaseValues baseValues) {
HundredsToWordsConverter hundredsToStringConverter = new HundredsToWordsConverter(baseValues.baseNumbers());
HundredsToWordsConverter hundredsToStringConverter = new HundredsToWordsConverter(baseValues.baseNumbers(),
baseValues.twoDigitsNumberSeparator());

integerConverter = new IntegerToWordsConverter(
hundredsToStringConverter,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
public class HundredsToWordsConverter implements GenderAwareIntegerToStringConverter {

private final Map<Integer, GenderForms> baseValues;
private char twoDigitsNumberSeparator;

public HundredsToWordsConverter(Map<Integer, GenderForms> baseValues) {
public HundredsToWordsConverter(Map<Integer, GenderForms> baseValues, char twoDigitsNumberSeparator) {
this.baseValues = baseValues;
this.twoDigitsNumberSeparator = twoDigitsNumberSeparator;
}

@Override
Expand All @@ -33,7 +35,7 @@ public String asWords(Integer value, GenderType genderType) {
private String twoDigitsNumberAsString(Integer value, GenderType genderType) {
Integer units = value % 10;
Integer tens = value - units;
return format("%s %s", asWords(tens, genderType), asWords(units, genderType));
return format("%s%c%s", asWords(tens, genderType), twoDigitsNumberSeparator, asWords(units, genderType));
}

private String threeDigitsNumberAsString(Integer value, GenderType genderType) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,9 @@ public List<PluralForms> pluralForms() {
public String currency() {
return "Kč";
}

@Override
public char twoDigitsNumberSeparator() {
return ' ';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,9 @@ public List<PluralForms> pluralForms() {
public String currency() {
return originalValues.currency();
}

@Override
public char twoDigitsNumberSeparator() {
return ' ';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package pl.allegro.finance.tradukisto.internal.languages.english;

import pl.allegro.finance.tradukisto.internal.languages.GenderType;
import pl.allegro.finance.tradukisto.internal.languages.PluralForms;

public class EnglishPluralForms implements PluralForms {

private final String form;

public EnglishPluralForms(String form) {
this.form = form;
}

@Override
public String formFor(Integer value) {
return form;
}

@Override
public GenderType genderType() {
return GenderType.NON_APPLICABLE;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package pl.allegro.finance.tradukisto.internal.languages.english;

import pl.allegro.finance.tradukisto.internal.BaseValues;
import pl.allegro.finance.tradukisto.internal.languages.GenderForms;
import pl.allegro.finance.tradukisto.internal.languages.PluralForms;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import static pl.allegro.finance.tradukisto.internal.support.BaseNumbersBuilder.baseNumbersBuilder;

public class EnglishValues implements BaseValues {

@Override
public Map<Integer, GenderForms> baseNumbers() {
return baseNumbersBuilder()
.put(0, "zero")
.put(1, "one")
.put(2, "two")
.put(3, "three")
.put(4, "four")
.put(5, "five")
.put(6, "six")
.put(7, "seven")
.put(8, "eight")
.put(9, "nine")
.put(10, "ten")
.put(11, "eleven")
.put(12, "twelve")
.put(13, "thirteen")
.put(14, "fourteen")
.put(15, "fifteen")
.put(16, "sixteen")
.put(17, "seventeen")
.put(18, "eighteen")
.put(19, "nineteen")
.put(20, "twenty")
.put(30, "thirty")
.put(40, "forty")
.put(50, "fifty")
.put(60, "sixty")
.put(70, "seventy")
.put(80, "eighty")
.put(90, "ninety")
.put(100, "one hundred")
.put(200, "two hundred")
.put(300, "three hundred")
.put(400, "four hundred")
.put(500, "five hundred")
.put(600, "six hundred")
.put(700, "seven hundred")
.put(800, "eight hundred")
.put(900, "nine hundred")
.build();
}

@Override
public List<PluralForms> pluralForms() {
return Arrays.<PluralForms>asList(
new EnglishPluralForms(""),
new EnglishPluralForms("thousand"),
new EnglishPluralForms("million"),
new EnglishPluralForms("bilion"));
}

@Override
public String currency() {
return "£";
}

@Override
public char twoDigitsNumberSeparator() {
return '-';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,9 @@ public List<PluralForms> pluralForms() {
public String currency() {
return "PLN";
}

@Override
public char twoDigitsNumberSeparator() {
return ' ';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.google.common.base.VerifyException
import spock.lang.Specification

import static pl.allegro.finance.tradukisto.MoneyConverters.CZECH_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.ENGLISH_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.POLISH_BANKING_MONEY_VALUE

class MoneyConvertersTest extends Specification {
Expand All @@ -18,6 +19,11 @@ class MoneyConvertersTest extends Specification {
CZECH_BANKING_MONEY_VALUE.asWords(1_234.56) == "jeden tisíc dvě stě třicet čtyři Kč 56/100"
}

def "should convert money in English"() {
expect:
ENGLISH_BANKING_MONEY_VALUE.asWords(1_234.56) == "one thousand two hundred thirty-four £ 56/100"
}

def "should throw exception when null given"() {
when:
POLISH_BANKING_MONEY_VALUE.asWords(null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.google.common.base.VerifyException
import spock.lang.Specification

import static pl.allegro.finance.tradukisto.ValueConverters.CZECH_INTEGER
import static pl.allegro.finance.tradukisto.ValueConverters.ENGLISH_INTEGER
import static pl.allegro.finance.tradukisto.ValueConverters.POLISH_INTEGER

class ValueConvertersTest extends Specification {
Expand All @@ -18,6 +19,11 @@ class ValueConvertersTest extends Specification {
CZECH_INTEGER.asWords(1_234) == "jeden tisíc dvě stě třicet čtyři"
}

def "should convert numbers in English"() {
expect:
ENGLISH_INTEGER.asWords(1_234) == "one thousand two hundred thirty-four"
}

def "should throw exception when null given"() {
when:
POLISH_INTEGER.asWords(null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,25 @@ import spock.lang.Specification
class BigDecimalToBankingMoneyConverterTest extends Specification {

def integerToStringConverter = Stub(IntegerToStringConverter)
def converter = new BigDecimalToBankingMoneyConverter(integerToStringConverter, "PLN")
def converter = new BigDecimalToBankingMoneyConverter(integerToStringConverter, "£")

def "setup"() {
integerToStringConverter.asWords(123) >> "sto dwadzieścia trzy"
integerToStringConverter.asWords(123) >> "one hundred twenty-three"
}

def "should convert whole numbers"() {
expect:
converter.asWords(123) == "sto dwadzieścia trzy PLN 00/100"
converter.asWords(123) == "one hundred twenty-three £ 00/100"
}

def "should convert value with one digit after decimal point"() {
expect:
converter.asWords(123.4) == "sto dwadzieścia trzy PLN 40/100"
converter.asWords(123.4) == "one hundred twenty-three £ 40/100"
}

def "should convert value with two digits after decimal point"() {
expect:
converter.asWords(123.4) == "sto dwadzieścia trzy PLN 40/100"
converter.asWords(123.4) == "one hundred twenty-three £ 40/100"
}

def "should not support thousands part of value"() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,33 +7,35 @@ import static pl.allegro.finance.tradukisto.internal.languages.GenderForms.gende

class HundredsToWordsConverterTest extends Specification {

char separator = '-'

def "should convert value from list of base values"() {
given:
def converter = new HundredsToWordsConverter([1: genderForm("jeden")])
def converter = new HundredsToWordsConverter([1: genderForm("one")], separator)

expect:
converter.asWords(1, GenderType.NON_APPLICABLE) == "jeden"
converter.asWords(1, GenderType.NON_APPLICABLE) == "one"
}

def "should convert two digits number"() {
given:
def converter = new HundredsToWordsConverter([20: genderForm("dwadzieścia"), 1: genderForm("jeden")])
def converter = new HundredsToWordsConverter([20: genderForm("twenty"), 1: genderForm("one")], separator)

expect:
converter.asWords(21, GenderType.NON_APPLICABLE) == "dwadzieścia jeden"
converter.asWords(21, GenderType.NON_APPLICABLE) == "twenty-one"
}

def "should convert three digits number"() {
given:
def converter = new HundredsToWordsConverter([600: genderForm("sześćset"), 60: genderForm("sześćdziesiąt"), 6: genderForm("sześć")])
def converter = new HundredsToWordsConverter([600: genderForm("six hundred"), 60: genderForm("sixty"), 6: genderForm("six")], separator)

expect:
converter.asWords(666, GenderType.NON_APPLICABLE) =="sześćset sześćdziesiąt sześć"
converter.asWords(666, GenderType.NON_APPLICABLE) =="six hundred sixty-six"
}

def "should throw IllegalArgumentException when given number is not supported"() {
given:
def converter = new HundredsToWordsConverter([1: genderForm("jeden")])
def converter = new HundredsToWordsConverter([1: genderForm("one")], separator)

when:
converter.asWords(2, GenderType.NON_APPLICABLE)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package pl.allegro.finance.tradukisto.internal.converters
import pl.allegro.finance.tradukisto.internal.GenderAwareIntegerToStringConverter
import pl.allegro.finance.tradukisto.internal.languages.polish.PolishValues
import pl.allegro.finance.tradukisto.internal.languages.english.EnglishValues
import spock.lang.Specification

class IntegerToWordsConverterTest extends Specification {

def hundredsToWordsConverter = Stub(GenderAwareIntegerToStringConverter)
def converter = new IntegerToWordsConverter(hundredsToWordsConverter, new PolishValues().pluralForms())
def converter = new IntegerToWordsConverter(hundredsToWordsConverter, new EnglishValues().pluralForms())

def setup() {
hundredsToWordsConverter.asWords(0, _) >> "zero"
hundredsToWordsConverter.asWords(1, _) >> "jeden"
hundredsToWordsConverter.asWords(2, _) >> "dwa"
hundredsToWordsConverter.asWords(3, _) >> "trzy"
hundredsToWordsConverter.asWords(1, _) >> "one"
hundredsToWordsConverter.asWords(2, _) >> "two"
hundredsToWordsConverter.asWords(3, _) >> "three"
}

def "should convert 0"() {
Expand All @@ -22,12 +22,12 @@ class IntegerToWordsConverterTest extends Specification {

def "should convert simply value"() {
expect:
converter.asWords(1) == "jeden"
converter.asWords(1) == "one"
}

def "should convert complex value"() {
expect:
converter.asWords(1002003) == "jeden milion dwa tysiące trzy"
converter.asWords(1002003) == "one million two thousand three"
}

def "should throw IllegalArgumentException when hundredsToWordsConverter can't convert given value"() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package pl.allegro.finance.tradukisto.internal.languages.english
import spock.lang.Specification

class EnglishPluralFormsTest extends Specification {

def pluralForms = new EnglishPluralForms("thousand")

def "should provide value for singular form"() {
expect:
pluralForms.formFor(value) == "thousand"

where:
value << (0..100)
}
}
Loading

0 comments on commit c19da81

Please sign in to comment.