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