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