001/*
002 * Copyright (c) 2012, 2013, Werner Keil, Credit Suisse (Anatole Tresch). Licensed under the Apache
003 * License, Version 2.0 (the "License"); you may not use this file except in compliance with the
004 * License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
005 * Unless required by applicable law or agreed to in writing, software distributed under the License
006 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
007 * or implied. See the License for the specific language governing permissions and limitations under
008 * the License. Contributors: Anatole Tresch - initial version.
009 */
010package org.javamoney.tck.tests.internal;
011
012import org.javamoney.tck.tests.conversion.TestExchangeRate;
013
014import javax.money.CurrencyUnit;
015import javax.money.MonetaryAmount;
016import javax.money.Monetary;
017import javax.money.convert.ConversionContext;
018import javax.money.convert.ConversionContextBuilder;
019import javax.money.convert.ConversionQuery;
020import javax.money.convert.CurrencyConversion;
021import javax.money.convert.ExchangeRate;
022import javax.money.convert.ExchangeRateProvider;
023import javax.money.convert.ProviderContext;
024import javax.money.convert.ProviderContextBuilder;
025import javax.money.convert.RateType;
026import java.util.Objects;
027
028/**
029 * Test ExchangeProvider. Created by Anatole on 26.04.2014.
030 */
031public class TestRateProvider implements ExchangeRateProvider {
032
033    private ProviderContext PC = ProviderContextBuilder.of("TestRateProvider", RateType.OTHER).build();
034    private ConversionContext CC = ConversionContextBuilder.create(PC, RateType.OTHER).build();
035    private CurrencyUnit TERM = new TestCurrencyUnit("FOO");
036
037    private CurrencyConversion CONVERSION = new CurrencyConversion() {
038
039        @Override
040        public CurrencyUnit getCurrency() {
041            return TERM;
042        }
043
044        @Override
045        public ConversionContext getContext() {
046            return CC;
047        }
048
049        @Override
050        public ExchangeRate getExchangeRate(MonetaryAmount sourceAmount) {
051            return new TestExchangeRate.Builder(CC).setFactor(new TestNumberValue(2))
052                    .setBase(sourceAmount.getCurrency()).setTerm(TERM).build();
053        }
054
055        @Override
056        public ExchangeRateProvider getExchangeRateProvider() {
057            return TestRateProvider.this;
058        }
059
060        @Override
061        public MonetaryAmount apply(MonetaryAmount value) {
062            return value.multiply(2).getFactory().setCurrency(TERM).create();
063        }
064    };
065
066    @Override
067    public ProviderContext getContext() {
068        return PC;
069    }
070
071    @Override
072    public boolean isAvailable(CurrencyUnit base, CurrencyUnit term) {
073        Objects.requireNonNull(base);
074        Objects.requireNonNull(term);
075        return "FOO".equals(term.getCurrencyCode()) || "XXX".equals(term.getCurrencyCode());
076    }
077
078    @Override
079    public boolean isAvailable(ConversionQuery conversionContext) {
080        Objects.requireNonNull(conversionContext);
081        Objects.requireNonNull(conversionContext.getCurrency());
082        return "FOO".equals(conversionContext.getCurrency().getCurrencyCode()) ||
083                "XXX".equals(conversionContext.getCurrency().getCurrencyCode());
084    }
085
086    @Override
087    public boolean isAvailable(String baseCode, String termCode) {
088        return "Foo".equals(termCode) || "XXX".equals(termCode);
089    }
090
091
092    @Override
093    public ExchangeRate getExchangeRate(CurrencyUnit base, CurrencyUnit term) {
094        if (isAvailable(base, term)) {
095            return new TestExchangeRate.Builder(CC).setFactor(new TestNumberValue(2)).setBase(base).setTerm(term)
096                    .build();
097        }
098        return null;
099    }
100
101    @Override
102    public ExchangeRate getExchangeRate(ConversionQuery conversionQuery) {
103        if (isAvailable(conversionQuery)) {
104            return new TestExchangeRate.Builder(
105                    ConversionContextBuilder.create(getContext(), RateType.OTHER).importContext(conversionQuery)
106                            .build()).setFactor(new TestNumberValue(2)).setBase(conversionQuery.getBaseCurrency())
107                    .setTerm(conversionQuery.getCurrency()).build();
108        }
109        return null;
110    }
111
112    @Override
113    public ExchangeRate getExchangeRate(String baseCode, String termCode) {
114        if (isAvailable(baseCode, termCode)) {
115            return getExchangeRate(Monetary.getCurrency(baseCode), TERM);
116        }
117        return null;
118    }
119
120    @Override
121    public ExchangeRate getReversed(ExchangeRate rate) {
122        return null;
123    }
124
125    @Override
126    public CurrencyConversion getCurrencyConversion(CurrencyUnit term) {
127        return CONVERSION;
128    }
129
130    @Override
131    public CurrencyConversion getCurrencyConversion(ConversionQuery conversionQuery) {
132        if (isAvailable(conversionQuery)) {
133            return CONVERSION;
134        }
135        return null;
136    }
137
138    @Override
139    public CurrencyConversion getCurrencyConversion(String termCode) {
140        if (TERM.getCurrencyCode().equals(termCode)) {
141            return CONVERSION;
142        }
143        return null;
144    }
145
146}