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.convert.*;
017import java.util.Objects;
018
019/**
020 * Test ExchangeRateProvider.
021 */
022public class TestRateProvider3 implements ExchangeRateProvider {
023
024    public static final int FACTOR = 3;
025    private static ProviderContext PC = ProviderContextBuilder.of("TestRateProvider3", RateType.OTHER).build();
026    private static ConversionContext CC = ConversionContextBuilder.create(PC, RateType.OTHER).build();
027
028    private static final class Conversion implements CurrencyConversion {
029
030        private CurrencyUnit term;
031
032        private Conversion(CurrencyUnit term) {
033            Objects.requireNonNull(term);
034            this.term = term;
035        }
036
037        @Override
038        public CurrencyUnit getCurrency() {
039            return term;
040        }
041
042        @Override
043        public ConversionContext getContext() {
044            return CC;
045        }
046
047        @Override
048        public ExchangeRate getExchangeRate(MonetaryAmount sourceAmount) {
049            return new TestExchangeRate.Builder(CC).setFactor(new TestNumberValue(FACTOR))
050                    .setBase(sourceAmount.getCurrency()).setTerm(term).build();
051        }
052
053        @Override
054        public MonetaryAmount apply(MonetaryAmount value) {
055            return value.multiply(FACTOR).getFactory().setCurrency(term).create();
056        }
057
058        @Override
059        public ExchangeRateProvider getExchangeRateProvider() {
060            return null;
061        }
062    }
063
064    @Override
065    public ProviderContext getContext() {
066        return PC;
067    }
068
069    @Override
070    public boolean isAvailable(ConversionQuery query) {
071        Objects.requireNonNull(query);
072        Objects.requireNonNull(query.getBaseCurrency());
073        Objects.requireNonNull(query.getCurrency());
074        return "USD".equals(query.getBaseCurrency().getCurrencyCode());
075    }
076
077    @Override
078    public ExchangeRate getExchangeRate(ConversionQuery query) {
079        if (isAvailable(query)) {
080            return new TestExchangeRate.Builder(PC.getProviderName(), RateType.OTHER).setFactor(new TestNumberValue(FACTOR))
081                    .setBase(query.getBaseCurrency()).setTerm(query.getCurrency()).build();
082        }
083        return null;
084    }
085
086    @Override
087    public CurrencyConversion getCurrencyConversion(ConversionQuery conversionQuery) {
088        Objects.requireNonNull(conversionQuery);
089        Objects.requireNonNull(conversionQuery.getCurrency());
090        return new Conversion(conversionQuery.getCurrency());
091    }
092
093}