package the8472.test.bencode;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static the8472.bencode.Utils.str2buf;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import java.util.concurrent.CompletableFuture;
import org.junit.Before;
import org.junit.Test;
import the8472.bencode.Tokenizer;
import the8472.bencode.Tokenizer.TokenConsumer;
import the8472.bencode.Tokenizer.TokenType;
import the8472.bencode.Tokenizer.Token;
public class TokenizerTest {
Tokenizer t;
@Before
public void readFile() throws IOException, URISyntaxException {
this.t = new Tokenizer();
//this.file = ByteBuffer.wrap(Files.readAllBytes(Paths.get(this.getClass().getResource(("./ubuntu-14.10-desktop-amd64.iso.torrent")).toURI())));
}
@Test
public void correctNumberHandling() {
ByteBuffer num = str2buf("d3:fooi-17ee");
CompletableFuture<Long> parsed = new CompletableFuture<>();
t.inputBuffer(num);
t.consumer(new TokenConsumer() {
@Override
public void pop(Token st) {
if(st.type() == TokenType.LONG)
parsed.complete(t.lastDecodedNum());
}
@Override
public void push(Token st) {}
});
t.tokenize();
assertEquals(-17L, (long)parsed.getNow(0L));
}
@Test
public void stopsBeforeTrailingContent() {
ByteBuffer trailing = str2buf("de|trailing");
CompletableFuture<Boolean> reachedEnd = new CompletableFuture<>();
t.inputBuffer(trailing);
t.consumer(new TokenConsumer() {
@Override
public void pop(Token st) {
if(st.type() == TokenType.DICT)
reachedEnd.complete(true);
}
@Override
public void push(Token st) {
// TODO Auto-generated method stub
}
});
t.tokenize();
assertEquals(2, trailing.position());
assertTrue(reachedEnd.getNow(false));
}
}