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 ExchangeProvider. Created by Anatole on 26.04.2014.
021 */
022public class TestRateProvider02 implements ExchangeRateProvider {
023
024    public static final double FACTOR = 0.2;
025    private static ProviderContext PC = ProviderContextBuilder.of("TestRateProvider02", 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 conversionQuery) {
071        Objects.requireNonNull(conversionQuery);
072        Objects.requireNonNull(conversionQuery.getCurrency());
073        return true;
074    }
075
076    @Override
077    public ExchangeRate getExchangeRate(ConversionQuery conversionQuery) {
078        Objects.requireNonNull(conversionQuery.getBaseCurrency());
079        if (isAvailable(conversionQuery)) {
080            return new TestExchangeRate.Builder(getContext().getProviderName(), RateType.OTHER)
081                    .setFactor(new TestNumberValue(FACTOR)).setBase(conversionQuery.getBaseCurrency())
082                    .setTerm(conversionQuery.getCurrency()).build();
083        }
084        return null;
085    }
086
087    @Override
088    public CurrencyConversion getCurrencyConversion(ConversionQuery conversionQuery) {
089        if (isAvailable(conversionQuery)) {
090            return new Conversion(conversionQuery.getCurrency());
091        }
092        return null;
093    }
094
095}