implement yeast

This commit is contained in:
nkzawa
2016-01-31 00:59:12 +09:00
parent 9363039a71
commit 109fcef0e1
2 changed files with 134 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
package io.socket.yeast;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.Arrays;
import java.util.Date;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertThat;
;
@RunWith(JUnit4.class)
public class YeastTest {
private void waitUntilNextMillisecond() {
long now = new Date().getTime();
while (new Date().getTime() == now) { /* do nothing */ }
}
@Test
public void prependsIteratedSeedWhenSamePreviousId() {
waitUntilNextMillisecond();
String[] ids = new String[] { Yeast.yeast(), Yeast.yeast(), Yeast.yeast() };
assertThat(ids[0], not(containsString(".")));
assertThat(ids[1], containsString(".0"));
assertThat(ids[2], containsString(".1"));
}
@Test
public void resetsTheSeed() {
waitUntilNextMillisecond();
String[] ids = new String[] { Yeast.yeast(), Yeast.yeast(), Yeast.yeast() };
assertThat(ids[0], not(containsString(".")));
assertThat(ids[1], containsString(".0"));
assertThat(ids[2], containsString(".1"));
waitUntilNextMillisecond();
ids = new String[] { Yeast.yeast(), Yeast.yeast(), Yeast.yeast() };
assertThat(ids[0], not(containsString(".")));
assertThat(ids[1], containsString(".0"));
assertThat(ids[2], containsString(".1"));
}
@Test
public void doesNotCollide() {
int length = 30000;
String[] ids = new String[length];
for (int i = 0; i < length; i++) ids[i] = Yeast.yeast();
Arrays.sort(ids);
for (int i = 0; i < length - 1; i++) {
assertThat(ids[i], not(equalTo(ids[i + 1])));
}
}
@Test
public void canConvertIdToTimestamp() {
waitUntilNextMillisecond();
long now = new Date().getTime();
String id = Yeast.yeast();
assertThat(Yeast.encode(now), equalTo(id));
assertThat(Yeast.decode(id), equalTo(now));
}
}