Skip to content

Commit

Permalink
For #5: ARC suggestions after review.
Browse files Browse the repository at this point in the history
  • Loading branch information
paulodamaso committed Jul 19, 2018
1 parent 9f5dcf1 commit 0e57800
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 57 deletions.
54 changes: 0 additions & 54 deletions src/main/java/io/zold/api/Network.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,10 @@
*/
package io.zold.api;

import java.util.Iterator;
import org.cactoos.iterable.Filtered;
import org.cactoos.iterable.HeadOf;
import org.cactoos.iterable.LengthOf;

/**
* Network of remote nodes.
*
* @since 0.1
* @checkstyle MagicNumberCheck (500 lines)
*/
public interface Network extends Iterable<Remote> {
/**
Expand All @@ -49,52 +43,4 @@ public interface Network extends Iterable<Remote> {
*/
Wallet pull(Long id);

/**
* Simple network implementation.
*/
final class Simple implements Network {

/**
* {@link Remote} nodes.
*/
private final Iterable<Remote> nodes;

/**
* Constructor.
* @param remotes Remotes of the network
*/
Simple(final Iterable<Remote> remotes) {
this.nodes = remotes;
}

@Override
public void push(final Wallet wallet) {
new HeadOf<Remote>(
1,
new Filtered<Remote>(
remote -> new LengthOf(
remote.score().suffixes()
).intValue() >= 16,
this.nodes
)
).forEach(
remote -> remote.push(wallet)
);
}

// @todo #5:30min Implement pull method. Pulling a wallet from the
// network should return all the wallets with that id in the
// network merged together. After the implementation
// NetworkTest.pullIsNotYetImplemented() have to be uncommented and
// test if pull method is behaving correctle.
@Override
public Wallet pull(final Long id) {
throw new UnsupportedOperationException("pull(id) not supported");
}

@Override
public Iterator<Remote> iterator() {
return this.nodes.iterator();
}
}
}
77 changes: 77 additions & 0 deletions src/main/java/io/zold/api/RtNetwork.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2018 Yegor Bugayenko
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package io.zold.api;

import java.util.Iterator;

/**
* Network implementation.
*
* @since 0.1
* @todo #5:30min We must figure out how to 'load' some network. Loading the
* network will be loading a local JSON file that contains data on all
* remote nodes that we know about; we must have a pre configured set of
* remote nodes built in too. See whitepaper for details.
*/
public final class RtNetwork implements Network {

/**
* {@link Remote} nodes.
*/
private final Iterable<Remote> nodes;

/**
* Constructor.
* @param remotes Remotes of the network
*/
RtNetwork(final Iterable<Remote> remotes) {
this.nodes = remotes;
}

// @todo #5:30min Implement scoring algorithm when paying taxes. Scoring
// algorithm must select the node with the highest score and with score
// >= 16. There are some tests for the scoring algorithm in NetworkTest:
// remove ignore tag from them after algorithm implementation.
@Override
public void push(final Wallet wallet) {
this.nodes.forEach(
remote -> remote.push(wallet)
);
}

// @todo #5:30min Implement pull method. Pulling a wallet from the
// network should return all the wallets with that id in the
// network merged together. After the implementation
// NetworkTest.pullIsNotYetImplemented() have to be uncommented and
// test if pull method is behaving correctly.
@Override
public Wallet pull(final Long id) {
throw new UnsupportedOperationException("pull(id) not supported");
}

@Override
public Iterator<Remote> iterator() {
return this.nodes.iterator();
}
}
9 changes: 6 additions & 3 deletions src/test/java/io/zold/api/NetworkTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.cactoos.iterable.IterableOf;
import org.cactoos.iterable.Repeated;
import org.cactoos.text.RandomText;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mockito;

Expand All @@ -44,6 +45,7 @@
public final class NetworkTest {

@Test
@Ignore
public void pushWalletToRightRemote() {
final Remote highremote = Mockito.mock(Remote.class);
final Score highscore = Mockito.mock(Score.class);
Expand All @@ -58,7 +60,7 @@ public void pushWalletToRightRemote() {
);
Mockito.when(lowremote.score()).thenReturn(lowscore);
final Wallet wallet = Mockito.mock(Wallet.class);
new Network.Simple(
new RtNetwork(
new IterableOf<Remote>(
highremote, lowremote
)
Expand All @@ -74,6 +76,7 @@ public void pushWalletToRightRemote() {
}

@Test
@Ignore
public void filtersUnqualifiedRemotesFromPush() {
final Remote remote = Mockito.mock(Remote.class);
final Score score = Mockito.mock(Score.class);
Expand All @@ -82,7 +85,7 @@ public void filtersUnqualifiedRemotesFromPush() {
);
Mockito.when(remote.score()).thenReturn(score);
final Wallet wallet = Mockito.mock(Wallet.class);
new Network.Simple(
new RtNetwork(
new IterableOf<Remote>(remote)
).push(wallet);
Mockito.verify(
Expand All @@ -93,7 +96,7 @@ public void filtersUnqualifiedRemotesFromPush() {

@Test(expected = UnsupportedOperationException.class)
public void pullNotYetSupported() {
new Network.Simple(new ArrayList<>(1)).pull(1L);
new RtNetwork(new ArrayList<>(1)).pull(1L);
}

}

0 comments on commit 0e57800

Please sign in to comment.