Merge branch 'master_origin'

This commit is contained in:
Manfred Karrer 2018-04-14 08:45:12 -05:00
commit d6337dcaaa
No known key found for this signature in database
GPG key ID: 401250966A6B2C46
16 changed files with 254 additions and 72 deletions

View file

@ -60,7 +60,6 @@ dependencies {
build.dependsOn installDist
installDist.destinationDir = file('build/app')
distZip.enabled = true
// generated with `./gradlew -q calculateChecksums | grep -v network.bisq:bisq-`
dependencyVerification {

View file

@ -217,6 +217,7 @@ D TradeStatistics (io.bisq.trade.statistics)
+ NodeAddress (io.bisq.p2p)
C+PaymentAccountContractData (io.bisq.payment)
+ AliPayAccountContractData (io.bisq.payment)
+ WeChatPayAccountContractData (io.bisq.payment)
+ ChaseQuickPayAccountContractData (io.bisq.payment)
+ ClearXchangeAccountContractData (io.bisq.payment)
C+ CountryBasedPaymentAccountContractData (io.bisq.payment)

View file

@ -50,10 +50,10 @@ public class CashAppForm extends PaymentMethodForm {
return gridRow;
}
public CashAppForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, CashAppValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
public CashAppForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, CashAppValidator cashAppValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter);
this.account = (CashAppAccount) paymentAccount;
this.validator = aliPayValidator;
this.validator = cashAppValidator;
}
@Override

View file

@ -50,10 +50,10 @@ public class MoneyBeamForm extends PaymentMethodForm {
return gridRow;
}
public MoneyBeamForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, MoneyBeamValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
public MoneyBeamForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, MoneyBeamValidator moneyBeamValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter);
this.account = (MoneyBeamAccount) paymentAccount;
this.validator = aliPayValidator;
this.validator = moneyBeamValidator;
}
@Override

View file

@ -52,10 +52,10 @@ public class PopmoneyForm extends PaymentMethodForm {
return gridRow;
}
public PopmoneyForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, PopmoneyValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
public PopmoneyForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, PopmoneyValidator popmoneyValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter);
this.account = (PopmoneyAccount) paymentAccount;
this.validator = aliPayValidator;
this.validator = popmoneyValidator;
}
@Override

View file

@ -52,10 +52,10 @@ public class VenmoForm extends PaymentMethodForm {
return gridRow;
}
public VenmoForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, VenmoValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
public VenmoForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, VenmoValidator venmoValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter);
this.account = (VenmoAccount) paymentAccount;
this.validator = aliPayValidator;
this.validator = venmoValidator;
}
@Override

View file

@ -0,0 +1,107 @@
/*
* This file is part of Bisq.
*
* Bisq is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Bisq is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Bisq. If not, see <http://www.gnu.org/licenses/>.
*/
package bisq.desktop.components.paymentmethods;
import bisq.desktop.components.InputTextField;
import bisq.desktop.util.BSFormatter;
import bisq.desktop.util.Layout;
import bisq.desktop.util.validation.WeChatPayValidator;
import bisq.core.locale.Res;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.AccountAgeWitnessService;
import bisq.core.payment.PaymentAccount;
import bisq.core.payment.WeChatPayAccount;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.payment.payload.WeChatPayAccountPayload;
import bisq.core.util.validation.InputValidator;
import org.apache.commons.lang3.StringUtils;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import static bisq.desktop.util.FormBuilder.addLabelInputTextField;
import static bisq.desktop.util.FormBuilder.addLabelTextField;
import static bisq.desktop.util.FormBuilder.addLabelTextFieldWithCopyIcon;
public class WeChatPayForm extends PaymentMethodForm {
private final WeChatPayAccount weChatPayAccount;
private final WeChatPayValidator weChatPayValidator;
private InputTextField accountNrInputTextField;
public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountPayload paymentAccountPayload) {
addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.account.no"), ((WeChatPayAccountPayload) paymentAccountPayload).getAccountNr());
return gridRow;
}
public WeChatPayForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, WeChatPayValidator weChatPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter);
this.weChatPayAccount = (WeChatPayAccount) paymentAccount;
this.weChatPayValidator = weChatPayValidator;
}
@Override
public void addFormForAddAccount() {
gridRowFrom = gridRow + 1;
accountNrInputTextField = addLabelInputTextField(gridPane, ++gridRow, Res.get("payment.account.no")).second;
accountNrInputTextField.setValidator(weChatPayValidator);
accountNrInputTextField.textProperty().addListener((ov, oldValue, newValue) -> {
weChatPayAccount.setAccountNr(newValue);
updateFromInputs();
});
final TradeCurrency singleTradeCurrency = weChatPayAccount.getSingleTradeCurrency();
final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : "";
addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode);
addLimitations();
addAccountNameTextFieldWithAutoFillCheckBox();
}
@Override
protected void autoFillNameTextField() {
if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) {
String accountNr = accountNrInputTextField.getText();
accountNr = StringUtils.abbreviate(accountNr, 9);
String method = Res.get(paymentAccount.getPaymentMethod().getId());
accountNameTextField.setText(method.concat(": ").concat(accountNr));
}
}
@Override
public void addFormForDisplayAccount() {
gridRowFrom = gridRow;
addLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), weChatPayAccount.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE);
addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.paymentMethod"), Res.get(weChatPayAccount.getPaymentMethod().getId()));
TextField field = addLabelTextField(gridPane, ++gridRow, Res.get("payment.account.no"), weChatPayAccount.getAccountNr()).second;
field.setMouseTransparent(false);
final TradeCurrency singleTradeCurrency = weChatPayAccount.getSingleTradeCurrency();
final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : "";
addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode);
addLimitations();
}
@Override
public void updateAllInputsValid() {
allInputsValid.set(isAccountNameValid()
&& weChatPayValidator.validate(weChatPayAccount.getAccountNr()).isValid
&& weChatPayAccount.getTradeCurrencies().size() > 0);
}
}

View file

@ -17,6 +17,18 @@
package bisq.desktop.main.account.content.fiataccounts;
import bisq.common.UserThread;
import bisq.common.util.Tuple2;
import bisq.common.util.Tuple3;
import bisq.core.app.BisqEnvironment;
import bisq.core.locale.Res;
import bisq.core.payment.AccountAgeWitnessService;
import bisq.core.payment.ClearXchangeAccount;
import bisq.core.payment.PaymentAccount;
import bisq.core.payment.PaymentAccountFactory;
import bisq.core.payment.WesternUnionAccount;
import bisq.core.payment.payload.PaymentMethod;
import bisq.core.util.validation.InputValidator;
import bisq.desktop.common.view.ActivatableViewAndModel;
import bisq.desktop.common.view.FxmlView;
import bisq.desktop.components.AutoTooltipButton;
@ -44,6 +56,7 @@ import bisq.desktop.components.paymentmethods.SwishForm;
import bisq.desktop.components.paymentmethods.USPostalMoneyOrderForm;
import bisq.desktop.components.paymentmethods.UpholdForm;
import bisq.desktop.components.paymentmethods.VenmoForm;
import bisq.desktop.components.paymentmethods.WeChatPayForm;
import bisq.desktop.components.paymentmethods.WesternUnionForm;
import bisq.desktop.main.overlays.popups.Popup;
import bisq.desktop.util.BSFormatter;
@ -66,25 +79,10 @@ import bisq.desktop.util.validation.SwishValidator;
import bisq.desktop.util.validation.USPostalMoneyOrderValidator;
import bisq.desktop.util.validation.UpholdValidator;
import bisq.desktop.util.validation.VenmoValidator;
import bisq.core.app.BisqEnvironment;
import bisq.core.locale.Res;
import bisq.core.payment.AccountAgeWitnessService;
import bisq.core.payment.ClearXchangeAccount;
import bisq.core.payment.PaymentAccount;
import bisq.core.payment.PaymentAccountFactory;
import bisq.core.payment.WesternUnionAccount;
import bisq.core.payment.payload.PaymentMethod;
import bisq.core.util.validation.InputValidator;
import bisq.common.UserThread;
import bisq.common.util.Tuple2;
import bisq.common.util.Tuple3;
import org.bitcoinj.core.Coin;
import javax.inject.Inject;
import bisq.desktop.util.validation.WeChatPayValidator;
import javafx.beans.value.ChangeListener;
import javafx.collections.FXCollections;
import javafx.geometry.VPos;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
@ -94,28 +92,24 @@ import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.scene.text.TextAlignment;
import javafx.geometry.VPos;
import javafx.beans.value.ChangeListener;
import javafx.collections.FXCollections;
import javafx.util.Callback;
import javafx.util.StringConverter;
import org.bitcoinj.core.Coin;
import javax.inject.Inject;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static bisq.desktop.util.FormBuilder.*;
import static bisq.desktop.util.FormBuilder.add2ButtonsAfterGroup;
import static bisq.desktop.util.FormBuilder.add3ButtonsAfterGroup;
import static bisq.desktop.util.FormBuilder.addLabelComboBox;
import static bisq.desktop.util.FormBuilder.addLabelListView;
import static bisq.desktop.util.FormBuilder.addTitledGroupBg;
@FxmlView
public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAccountsViewModel> {
private ListView<PaymentAccount> paymentAccountsListView;
private ComboBox<PaymentMethod> paymentMethodComboBox;
private final IBANValidator ibanValidator;
private final BICValidator bicValidator;
private final InputValidator inputValidator;
@ -133,10 +127,11 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
private final ChaseQuickPayValidator chaseQuickPayValidator;
private final InteracETransferValidator interacETransferValidator;
private final USPostalMoneyOrderValidator usPostalMoneyOrderValidator;
private final WeChatPayValidator weChatPayValidator;
private final AccountAgeWitnessService accountAgeWitnessService;
private final BSFormatter formatter;
private ListView<PaymentAccount> paymentAccountsListView;
private ComboBox<PaymentMethod> paymentMethodComboBox;
private PaymentMethodForm paymentMethodForm;
private TitledGroupBg accountTitledGroupBg;
private Button addAccountButton, saveNewAccountButton, exportButton, importButton;
@ -162,6 +157,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
ChaseQuickPayValidator chaseQuickPayValidator,
InteracETransferValidator interacETransferValidator,
USPostalMoneyOrderValidator usPostalMoneyOrderValidator,
WeChatPayValidator weChatPayValidator,
AccountAgeWitnessService accountAgeWitnessService,
BSFormatter formatter) {
super(model);
@ -183,6 +179,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
this.chaseQuickPayValidator = chaseQuickPayValidator;
this.interacETransferValidator = interacETransferValidator;
this.usPostalMoneyOrderValidator = usPostalMoneyOrderValidator;
this.weChatPayValidator = weChatPayValidator;
this.accountAgeWitnessService = accountAgeWitnessService;
this.formatter = formatter;
}
@ -449,6 +446,8 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
return new SpecificBankForm(paymentAccount, accountAgeWitnessService, inputValidator, root, gridRow, formatter, this::onCancelNewAccount);
case PaymentMethod.ALI_PAY_ID:
return new AliPayForm(paymentAccount, accountAgeWitnessService, aliPayValidator, inputValidator, root, gridRow, formatter);
case PaymentMethod.WECHAT_PAY_ID:
return new WeChatPayForm(paymentAccount, accountAgeWitnessService, weChatPayValidator, inputValidator, root, gridRow, formatter);
case PaymentMethod.SWISH_ID:
return new SwishForm(paymentAccount, accountAgeWitnessService, swishValidator, inputValidator, root, gridRow, formatter);
case PaymentMethod.CLEAR_X_CHANGE_ID:

View file

@ -51,6 +51,10 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
class SpreadViewModel extends ActivatableViewModel {
@ -90,6 +94,11 @@ class SpreadViewModel extends ActivatableViewModel {
offerBookListItems.removeListener(listChangeListener);
}
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
private void update(ObservableList<OfferBookListItem> offerBookListItems) {
Map<String, List<Offer>> offersByCurrencyMap = new HashMap<>();
for (OfferBookListItem offerBookListItem : offerBookListItems) {
@ -106,7 +115,10 @@ class SpreadViewModel extends ActivatableViewModel {
for (String currencyCode : offersByCurrencyMap.keySet()) {
List<Offer> offers = offersByCurrencyMap.get(currencyCode);
final boolean isFiatCurrency = CurrencyUtil.isFiatCurrency(currencyCode);
List<Offer> buyOffers = offers
List<Offer> uniqueOffers = offers.stream().filter(distinctByKey(Offer::getId)).collect(Collectors.toList());
List<Offer> buyOffers = uniqueOffers
.stream()
.filter(e -> e.getDirection().equals(OfferPayload.Direction.BUY))
.sorted((o1, o2) -> {
@ -123,7 +135,7 @@ class SpreadViewModel extends ActivatableViewModel {
})
.collect(Collectors.toList());
List<Offer> sellOffers = offers
List<Offer> sellOffers = uniqueOffers
.stream()
.filter(e -> e.getDirection().equals(OfferPayload.Direction.SELL))
.sorted((o1, o2) -> {
@ -198,7 +210,7 @@ class SpreadViewModel extends ActivatableViewModel {
totalAmount = Coin.valueOf(offers.stream().mapToLong(offer -> offer.getAmount().getValue()).sum());
spreadItems.add(new SpreadItem(currencyCode, buyOffers.size(), sellOffers.size(),
offers.size(), spread, percentage, totalAmount));
uniqueOffers.size(), spread, percentage, totalAmount));
}
maxPlacesForAmount.set(formatAmount(totalAmount, false).length());

View file

@ -41,6 +41,7 @@ import bisq.desktop.components.paymentmethods.SwishForm;
import bisq.desktop.components.paymentmethods.USPostalMoneyOrderForm;
import bisq.desktop.components.paymentmethods.UpholdForm;
import bisq.desktop.components.paymentmethods.VenmoForm;
import bisq.desktop.components.paymentmethods.WeChatPayForm;
import bisq.desktop.components.paymentmethods.WesternUnionForm;
import bisq.desktop.main.overlays.popups.Popup;
import bisq.desktop.main.portfolio.pendingtrades.PendingTradesViewModel;
@ -226,6 +227,9 @@ public class BuyerStep2View extends TradeStepView {
case PaymentMethod.ALI_PAY_ID:
gridRow = AliPayForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload);
break;
case PaymentMethod.WECHAT_PAY_ID:
gridRow = WeChatPayForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload);
break;
case PaymentMethod.CLEAR_X_CHANGE_ID:
gridRow = ClearXchangeForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload);
break;

View file

@ -0,0 +1,29 @@
/*
* This file is part of Bisq.
*
* Bisq is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Bisq is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Bisq. If not, see <http://www.gnu.org/licenses/>.
*/
package bisq.desktop.util.validation;
import bisq.core.util.validation.InputValidator;
public final class WeChatPayValidator extends InputValidator {
@Override
public ValidationResult validate(String input) {
// TODO
return super.validate(input);
}
}

View file

@ -33,9 +33,10 @@ public class OfferMaker {
public static final Property<Offer, OfferPayload.Direction> direction = new Property<>();
public static final Property<Offer, Boolean> useMarketBasedPrice = new Property<>();
public static final Property<Offer, Double> marketPriceMargin = new Property<>();
public static final Property<Offer, String> id = new Property<>();
public static final Instantiator<Offer> Offer = lookup -> new Offer(
new OfferPayload("",
new OfferPayload(lookup.valueOf(id, "1234"),
0L,
null,
null,

View file

@ -39,7 +39,7 @@ import org.junit.runner.RunWith;
import static bisq.core.locale.TradeCurrencyMakers.usd;
import static bisq.core.user.PreferenceMakers.empty;
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcItem;
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcBuyItem;
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcSellItem;
import static com.natpryce.makeiteasy.MakeItEasy.make;
import static com.natpryce.makeiteasy.MakeItEasy.with;
@ -75,7 +75,7 @@ public class OfferBookChartViewModelTest {
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
final OfferBookListItem item = make(OfferBookListItemMaker.btcItem.but(with(OfferBookListItemMaker.useMarketBasedPrice, true)));
final OfferBookListItem item = make(OfferBookListItemMaker.btcBuyItem.but(with(OfferBookListItemMaker.useMarketBasedPrice, true)));
item.getOffer().setPriceFeedService(priceFeedService);
offerBookListItems.addAll(item);
@ -93,16 +93,16 @@ public class OfferBookChartViewModelTest {
OfferBook offerBook = mock(OfferBook.class);
PriceFeedService service = mock(PriceFeedService.class);
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
offerBookListItems.addAll(make(OfferBookListItemMaker.btcBuyItem));
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
final OfferBookChartViewModel model = new OfferBookChartViewModel(offerBook, empty, service, null, null, new BSFormatter());
model.activate();
assertEquals(7, model.maxPlacesForBuyPrice.intValue());
offerBookListItems.addAll(make(btcItem.but(with(OfferBookListItemMaker.price, 94016475L))));
offerBookListItems.addAll(make(btcBuyItem.but(with(OfferBookListItemMaker.price, 94016475L))));
assertEquals(9, model.maxPlacesForBuyPrice.intValue());
offerBookListItems.addAll(make(btcItem.but(with(OfferBookListItemMaker.price, 101016475L))));
offerBookListItems.addAll(make(btcBuyItem.but(with(OfferBookListItemMaker.price, 101016475L))));
assertEquals(10, model.maxPlacesForBuyPrice.intValue());
}
@ -122,16 +122,16 @@ public class OfferBookChartViewModelTest {
OfferBook offerBook = mock(OfferBook.class);
PriceFeedService service = mock(PriceFeedService.class);
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
offerBookListItems.addAll(make(OfferBookListItemMaker.btcBuyItem));
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
final OfferBookChartViewModel model = new OfferBookChartViewModel(offerBook, empty, service, null, null, new BSFormatter());
model.activate();
assertEquals(4, model.maxPlacesForBuyVolume.intValue()); //0.01
offerBookListItems.addAll(make(btcItem.but(with(OfferBookListItemMaker.amount, 100000000L))));
offerBookListItems.addAll(make(btcBuyItem.but(with(OfferBookListItemMaker.amount, 100000000L))));
assertEquals(5, model.maxPlacesForBuyVolume.intValue()); //10.00
offerBookListItems.addAll(make(btcItem.but(with(OfferBookListItemMaker.amount, 22128600000L))));
offerBookListItems.addAll(make(btcBuyItem.but(with(OfferBookListItemMaker.amount, 22128600000L))));
assertEquals(7, model.maxPlacesForBuyVolume.intValue()); //2212.86
}

View file

@ -23,6 +23,8 @@ import bisq.desktop.main.offer.offerbook.OfferBookListItem;
import bisq.desktop.main.offer.offerbook.OfferBookListItemMaker;
import bisq.desktop.util.BSFormatter;
import bisq.core.provider.price.PriceFeedService;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
@ -32,7 +34,9 @@ import org.powermock.modules.junit4.PowerMockRunner;
import org.junit.Test;
import org.junit.runner.RunWith;
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcItem;
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcBuyItem;
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcSellItem;
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.id;
import static com.natpryce.makeiteasy.MakeItEasy.make;
import static com.natpryce.makeiteasy.MakeItEasy.with;
import static org.junit.Assert.assertEquals;
@ -40,7 +44,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest(OfferBook.class)
@PrepareForTest({OfferBook.class, PriceFeedService.class})
public class SpreadViewModelTest {
@Test
@ -50,7 +54,7 @@ public class SpreadViewModelTest {
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
final SpreadViewModel model = new SpreadViewModel(offerBook, null, new BSFormatter());
SpreadViewModel model = new SpreadViewModel(offerBook, null, new BSFormatter());
assertEquals(0, model.maxPlacesForAmount.intValue());
}
@ -58,14 +62,38 @@ public class SpreadViewModelTest {
public void testMaxCharactersForAmount() {
OfferBook offerBook = mock(OfferBook.class);
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
offerBookListItems.addAll(make(btcBuyItem));
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
final SpreadViewModel model = new SpreadViewModel(offerBook, null, new BSFormatter());
SpreadViewModel model = new SpreadViewModel(offerBook, null, new BSFormatter());
model.activate();
assertEquals(6, model.maxPlacesForAmount.intValue()); // 0.001
offerBookListItems.addAll(make(btcItem.but(with(OfferBookListItemMaker.amount, 1403000000L))));
offerBookListItems.addAll(make(btcBuyItem.but(with(OfferBookListItemMaker.amount, 1403000000L))));
assertEquals(7, model.maxPlacesForAmount.intValue()); //14.0300
}
@Test
public void testFilterSpreadItemsForUniqueOffers() {
OfferBook offerBook = mock(OfferBook.class);
PriceFeedService priceFeedService = mock(PriceFeedService.class);
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
offerBookListItems.addAll(make(btcBuyItem));
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
SpreadViewModel model = new SpreadViewModel(offerBook, priceFeedService, new BSFormatter());
model.activate();
assertEquals(1, model.spreadItems.get(0).numberOfOffers);
offerBookListItems.addAll(make(btcBuyItem.but(with(id, "2345"))),
make(btcBuyItem.but(with(id, "2345"))),
make(btcSellItem.but(with(id, "3456"))),
make(btcSellItem.but(with(id, "3456"))));
assertEquals(2, model.spreadItems.get(0).numberOfBuyOffers);
assertEquals(1, model.spreadItems.get(0).numberOfSellOffers);
assertEquals(3, model.spreadItems.get(0).numberOfOffers);
}
}

View file

@ -32,6 +32,7 @@ import static com.natpryce.makeiteasy.MakeItEasy.with;
public class OfferBookListItemMaker {
public static final Property<OfferBookListItem, String> id = new Property<>();
public static final Property<OfferBookListItem, Long> price = new Property<>();
public static final Property<OfferBookListItem, Long> amount = new Property<>();
public static final Property<OfferBookListItem, Long> minAmount = new Property<>();
@ -46,7 +47,8 @@ public class OfferBookListItemMaker {
with(OfferMaker.minAmount, lookup.valueOf(amount, 100000L)),
with(OfferMaker.direction, lookup.valueOf(direction, OfferPayload.Direction.BUY)),
with(OfferMaker.useMarketBasedPrice, lookup.valueOf(useMarketBasedPrice, false)),
with(OfferMaker.marketPriceMargin, lookup.valueOf(marketPriceMargin, 0.0)))));
with(OfferMaker.marketPriceMargin, lookup.valueOf(marketPriceMargin, 0.0)),
with(OfferMaker.id, lookup.valueOf(id, "1234")))));
public static final Instantiator<OfferBookListItem> OfferBookListItemWithRange = lookup ->
new OfferBookListItem(make(btcUsdOffer.but(
@ -54,7 +56,7 @@ public class OfferBookListItemMaker {
with(OfferMaker.minAmount, lookup.valueOf(minAmount, 100000L)),
with(OfferMaker.amount, lookup.valueOf(amount, 200000L)))));
public static final Maker<OfferBookListItem> btcItem = a(OfferBookListItem);
public static final Maker<OfferBookListItem> btcBuyItem = a(OfferBookListItem);
public static final Maker<OfferBookListItem> btcSellItem = a(OfferBookListItem, with(direction, OfferPayload.Direction.SELL));
public static final Maker<OfferBookListItem> btcItemWithRange = a(OfferBookListItemWithRange);

View file

@ -242,7 +242,7 @@ public class OfferBookViewModelTest {
OfferBook offerBook = mock(OfferBook.class);
OpenOfferManager openOfferManager = mock(OpenOfferManager.class);
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
offerBookListItems.addAll(make(OfferBookListItemMaker.btcBuyItem));
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
@ -252,7 +252,7 @@ public class OfferBookViewModelTest {
model.activate();
assertEquals(6, model.maxPlacesForAmount.intValue());
offerBookListItems.addAll(make(btcItem.but(with(amount, 2000000000L))));
offerBookListItems.addAll(make(btcBuyItem.but(with(amount, 2000000000L))));
assertEquals(7, model.maxPlacesForAmount.intValue());
}
@ -296,7 +296,7 @@ public class OfferBookViewModelTest {
OfferBook offerBook = mock(OfferBook.class);
OpenOfferManager openOfferManager = mock(OpenOfferManager.class);
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
offerBookListItems.addAll(make(OfferBookListItemMaker.btcBuyItem));
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
@ -306,7 +306,7 @@ public class OfferBookViewModelTest {
model.activate();
assertEquals(8, model.maxPlacesForVolume.intValue());
offerBookListItems.addAll(make(btcItem.but(with(amount, 2000000000L))));
offerBookListItems.addAll(make(btcBuyItem.but(with(amount, 2000000000L))));
assertEquals(10, model.maxPlacesForVolume.intValue());
}
@ -350,7 +350,7 @@ public class OfferBookViewModelTest {
OfferBook offerBook = mock(OfferBook.class);
OpenOfferManager openOfferManager = mock(OpenOfferManager.class);
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
offerBookListItems.addAll(make(OfferBookListItemMaker.btcBuyItem));
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
@ -360,9 +360,9 @@ public class OfferBookViewModelTest {
model.activate();
assertEquals(7, model.maxPlacesForPrice.intValue());
offerBookListItems.addAll(make(btcItem.but(with(price, 149558240L)))); //14955.8240
offerBookListItems.addAll(make(btcBuyItem.but(with(price, 149558240L)))); //14955.8240
assertEquals(10, model.maxPlacesForPrice.intValue());
offerBookListItems.addAll(make(btcItem.but(with(price, 14955824L)))); //1495.58240
offerBookListItems.addAll(make(btcBuyItem.but(with(price, 14955824L)))); //1495.58240
assertEquals(10, model.maxPlacesForPrice.intValue());
}
@ -386,7 +386,7 @@ public class OfferBookViewModelTest {
PriceFeedService priceFeedService = mock(PriceFeedService.class);
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
final Maker<OfferBookListItem> item = btcItem.but(with(useMarketBasedPrice, true));
final Maker<OfferBookListItem> item = btcBuyItem.but(with(useMarketBasedPrice, true));
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
when(priceFeedService.getMarketPrice(anyString())).thenReturn(null);
@ -428,15 +428,15 @@ public class OfferBookViewModelTest {
null, null, null, null, null,
new BSFormatter());
final OfferBookListItem item = make(btcItem.but(
final OfferBookListItem item = make(btcBuyItem.but(
with(useMarketBasedPrice, true),
with(marketPriceMargin, -0.12)));
final OfferBookListItem lowItem = make(btcItem.but(
final OfferBookListItem lowItem = make(btcBuyItem.but(
with(useMarketBasedPrice, true),
with(marketPriceMargin, 0.01)));
final OfferBookListItem fixedItem = make(btcItem);
final OfferBookListItem fixedItem = make(btcBuyItem);
item.getOffer().setPriceFeedService(priceFeedService);
lowItem.getOffer().setPriceFeedService(priceFeedService);