diff --git a/core-java/pom.xml b/core-java/pom.xml index 294364d22c..a96da6761f 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -163,7 +163,7 @@ 5.1.2.Final - 17.0 + 17.0 3.3.2 diff --git a/core-java/src/test/java/org/baeldung/java/CoreJavaRandomUnitTest.java b/core-java/src/test/java/org/baeldung/java/CoreJavaRandomUnitTest.java index 95cd1b7c50..2b688ecb10 100644 --- a/core-java/src/test/java/org/baeldung/java/CoreJavaRandomUnitTest.java +++ b/core-java/src/test/java/org/baeldung/java/CoreJavaRandomUnitTest.java @@ -1,5 +1,6 @@ package org.baeldung.java; +import java.nio.charset.Charset; import java.util.Random; import org.apache.commons.lang3.RandomStringUtils; @@ -151,7 +152,7 @@ public class CoreJavaRandomUnitTest { public void givenUsingPlainJava_whenGeneratingRandomStringUnbounded_thenCorrect() { final byte[] array = new byte[7]; // length is bounded by 7 new Random().nextBytes(array); - final String generatedString = new String(array); + final String generatedString = new String(array, Charset.forName("UTF-8")); System.out.println(generatedString); } @@ -166,7 +167,7 @@ public class CoreJavaRandomUnitTest { final int randomLimitedInt = leftLimit + (int) (new Random().nextFloat() * (rightLimit - leftLimit)); buffer.append((char) randomLimitedInt); } - final String generatedString = new String(buffer); + final String generatedString = buffer.toString(); System.out.println(generatedString); } diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaReadFromFileTest.java b/core-java/src/test/java/org/baeldung/java/io/JavaReadFromFileTest.java new file mode 100644 index 0000000000..72f658eb06 --- /dev/null +++ b/core-java/src/test/java/org/baeldung/java/io/JavaReadFromFileTest.java @@ -0,0 +1,181 @@ +package org.baeldung.java.io; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.RandomAccessFile; +import java.io.SequenceInputStream; +import java.io.StreamTokenizer; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Scanner; + +import org.junit.Test; + + +/* +MappedByteBuffer + + */ +public class JavaReadFromFileTest { + + @Test + public void whenReadWithBufferedReader_thenCorrect() throws IOException { + final String expected_value = "Hello world"; + + final BufferedReader reader = new BufferedReader(new FileReader("src/test/resources/test_read.in")); + final String currentLine = reader.readLine(); + reader.close(); + + assertEquals(expected_value, currentLine); + } + + @Test + public void whenReadWithScanner_thenCorrect() throws IOException { + final Scanner scanner = new Scanner(new File("src/test/resources/test_read1.in")); + scanner.useDelimiter(" "); + + assertTrue(scanner.hasNext()); + assertEquals("Hello", scanner.next()); + assertEquals("world", scanner.next()); + assertEquals(1, scanner.nextInt()); + + scanner.close(); + + } + + @Test + public void whenReadWithScannerTwoDelimiters_thenCorrect() throws IOException { + final Scanner scanner = new Scanner(new File("src/test/resources/test_read2.in")); + scanner.useDelimiter(",| "); + + assertTrue(scanner.hasNextInt()); + assertEquals(2, scanner.nextInt()); + assertEquals(3, scanner.nextInt()); + assertEquals(4, scanner.nextInt()); + + scanner.close(); + } + + @Test + public void whenReadWithStreamTokenizer_thenCorrectTokens() throws IOException { + final FileReader reader = new FileReader("src/test/resources/test_read3.in"); + final StreamTokenizer tokenizer = new StreamTokenizer(reader); + + tokenizer.nextToken(); + assertEquals(StreamTokenizer.TT_WORD, tokenizer.ttype); + assertEquals("Hello", tokenizer.sval); + tokenizer.nextToken(); + assertEquals(StreamTokenizer.TT_NUMBER, tokenizer.ttype); + assertEquals(1, tokenizer.nval, 0.0000001); + + tokenizer.nextToken(); + assertEquals(StreamTokenizer.TT_EOF, tokenizer.ttype); + reader.close(); + } + + @Test + public void whenReadWithDataInputStream_thenCorrect() throws IOException { + final String expected_value = "Hello"; + + String result; + final DataInputStream reader = new DataInputStream(new FileInputStream("src/test/resources/test_read4.in")); + result = reader.readUTF(); + reader.close(); + + assertEquals(expected_value, result); + } + + public void whenReadTwoFilesWithSequenceInputStream_thenCorrect() throws IOException { + final int expected_value1 = 2000; + final int expected_value2 = 5000; + + final FileInputStream stream1 = new FileInputStream("src/test/resources/test_read5.in"); + final FileInputStream stream2 = new FileInputStream("src/test/resources/test_read6.in"); + + final SequenceInputStream sequence = new SequenceInputStream(stream1, stream2); + final DataInputStream reader = new DataInputStream(sequence); + + assertEquals(expected_value1, reader.readInt()); + assertEquals(expected_value2, reader.readInt()); + + reader.close(); + stream2.close(); + } + + + @Test + public void whenReadUTFEncodedFile_thenCorrect() throws IOException { + final String expected_value = "青空"; + final BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("src/test/resources/test_read7.in"), "UTF-8")); + final String currentLine = reader.readLine(); + reader.close(); + + assertEquals(expected_value, currentLine); + } + + @Test + public void whenReadFileContentsIntoString_thenCorrect() throws IOException { + final String expected_value = "Hello world \n Test line \n"; + final BufferedReader reader = new BufferedReader(new FileReader("src/test/resources/test_read8.in")); + final StringBuilder builder = new StringBuilder(); + String currentLine = reader.readLine(); + while (currentLine != null) { + builder.append(currentLine); + builder.append("\n"); + currentLine = reader.readLine(); + } + + reader.close(); + + assertEquals(expected_value, builder.toString()); + } + + @Test + public void whenReadWithFileChannel_thenCorrect() throws IOException { + final String expected_value = "Hello world"; + final RandomAccessFile reader = new RandomAccessFile("src/test/resources/test_read.in", "r"); + final FileChannel channel = reader.getChannel(); + + int bufferSize = 1024; + if (bufferSize > channel.size()) + bufferSize = (int) channel.size(); + final ByteBuffer buff = ByteBuffer.allocate(bufferSize); + channel.read(buff); + buff.flip(); + assertEquals(expected_value, new String(buff.array())); + channel.close(); + reader.close(); + } + + @Test + public void whenReadSmallFileJava7_thenCorrect() throws IOException { + final String expected_value = "Hello world"; + final Path path = Paths.get("src/test/resources/test_read.in"); + + final String read = Files.readAllLines(path).get(0); + assertEquals(expected_value, read); + } + + @Test + public void whenReadLargeFileJava7_thenCorrect() throws IOException { + final String expected_value = "Hello world"; + + final Path path = Paths.get("src/test/resources/test_read.in"); + final BufferedReader reader = Files.newBufferedReader(path); + final String line = reader.readLine(); + assertEquals(expected_value, line); + } + + +} diff --git a/core-java/src/test/resources/test_read.in b/core-java/src/test/resources/test_read.in new file mode 100644 index 0000000000..70c379b63f --- /dev/null +++ b/core-java/src/test/resources/test_read.in @@ -0,0 +1 @@ +Hello world \ No newline at end of file diff --git a/core-java/src/test/resources/test_read1.in b/core-java/src/test/resources/test_read1.in new file mode 100644 index 0000000000..1e46242993 --- /dev/null +++ b/core-java/src/test/resources/test_read1.in @@ -0,0 +1 @@ +Hello world 1 \ No newline at end of file diff --git a/core-java/src/test/resources/test_read2.in b/core-java/src/test/resources/test_read2.in new file mode 100644 index 0000000000..fe47dc003b --- /dev/null +++ b/core-java/src/test/resources/test_read2.in @@ -0,0 +1 @@ +2,3 4 \ No newline at end of file diff --git a/core-java/src/test/resources/test_read3.in b/core-java/src/test/resources/test_read3.in new file mode 100644 index 0000000000..db9f25a672 --- /dev/null +++ b/core-java/src/test/resources/test_read3.in @@ -0,0 +1 @@ +Hello 1 \ No newline at end of file diff --git a/core-java/src/test/resources/test_read4.in b/core-java/src/test/resources/test_read4.in new file mode 100644 index 0000000000..5727d54bfc Binary files /dev/null and b/core-java/src/test/resources/test_read4.in differ diff --git a/core-java/src/test/resources/test_read7.in b/core-java/src/test/resources/test_read7.in new file mode 100644 index 0000000000..28d4d45d43 --- /dev/null +++ b/core-java/src/test/resources/test_read7.in @@ -0,0 +1 @@ +青空 \ No newline at end of file diff --git a/core-java/src/test/resources/test_read8.in b/core-java/src/test/resources/test_read8.in new file mode 100644 index 0000000000..10fc1aac8a --- /dev/null +++ b/core-java/src/test/resources/test_read8.in @@ -0,0 +1,2 @@ +Hello world + Test line diff --git a/guava/src/test/java/org/baeldung/guava/GuavaCacheTest.java b/guava/src/test/java/org/baeldung/guava/GuavaCacheTest.java new file mode 100644 index 0000000000..87aba20ec3 --- /dev/null +++ b/guava/src/test/java/org/baeldung/guava/GuavaCacheTest.java @@ -0,0 +1,214 @@ +package org.baeldung.guava; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.junit.Test; + +import com.google.common.base.Optional; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.cache.RemovalCause; +import com.google.common.cache.RemovalListener; +import com.google.common.cache.RemovalNotification; +import com.google.common.cache.Weigher; + +public class GuavaCacheTest { + + @Test + public void whenCacheMiss_thenAutoLoad() { + final CacheLoader loader = new CacheLoader() { + @Override + public final String load(final String key) { + return key.toUpperCase(); + } + }; + final LoadingCache cache = CacheBuilder.newBuilder().build(loader); + assertEquals(0, cache.size()); + assertEquals("HELLO", cache.getUnchecked("hello")); + assertEquals(1, cache.size()); + } + + @Test + public void whenCacheReachMaxSize_thenEviction() { + final CacheLoader loader = new CacheLoader() { + @Override + public final String load(final String key) { + return key.toUpperCase(); + } + }; + final LoadingCache cache = CacheBuilder.newBuilder().maximumSize(3).build(loader); + cache.getUnchecked("first"); + cache.getUnchecked("second"); + cache.getUnchecked("third"); + cache.getUnchecked("forth"); + assertEquals(3, cache.size()); + assertNull(cache.getIfPresent("first")); + assertEquals("FORTH", cache.getIfPresent("forth")); + } + + @Test + public void whenCacheReachMaxWeight_thenEviction() { + final CacheLoader loader = new CacheLoader() { + @Override + public final String load(final String key) { + return key.toUpperCase(); + } + }; + final Weigher weighByLength = new Weigher() { + @Override + public int weigh(final String key, final String value) { + return value.length(); + } + }; + final LoadingCache cache = CacheBuilder.newBuilder().maximumWeight(16).weigher(weighByLength).build(loader); + cache.getUnchecked("first"); + cache.getUnchecked("second"); + cache.getUnchecked("third"); + cache.getUnchecked("last"); + assertEquals(3, cache.size()); + assertNull(cache.getIfPresent("first")); + assertEquals("LAST", cache.getIfPresent("last")); + } + + @Test + public void whenEntryIdle_thenEviction() throws InterruptedException { + final CacheLoader loader = new CacheLoader() { + @Override + public final String load(final String key) { + return key.toUpperCase(); + } + }; + final LoadingCache cache = CacheBuilder.newBuilder().expireAfterAccess(2, TimeUnit.MILLISECONDS).build(loader); + cache.getUnchecked("hello"); + assertEquals(1, cache.size()); + cache.getUnchecked("hello"); + Thread.sleep(300); + cache.getUnchecked("test"); + assertEquals(1, cache.size()); + assertNull(cache.getIfPresent("hello")); + } + + @Test + public void whenEntryLiveTimeExpire_thenEviction() throws InterruptedException { + final CacheLoader loader = new CacheLoader() { + @Override + public final String load(final String key) { + return key.toUpperCase(); + } + }; + final LoadingCache cache = CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.MILLISECONDS).build(loader); + cache.getUnchecked("hello"); + assertEquals(1, cache.size()); + Thread.sleep(300); + cache.getUnchecked("test"); + assertEquals(1, cache.size()); + assertNull(cache.getIfPresent("hello")); + } + + @Test + public void whenWeekKeyHasNoRef_thenRemoveFromCache() { + final CacheLoader loader = new CacheLoader() { + @Override + public final String load(final String key) { + return key.toUpperCase(); + } + }; + final LoadingCache cache = CacheBuilder.newBuilder().weakKeys().build(loader); + } + + @Test + public void whenSoftValue_thenRemoveFromCache() { + final CacheLoader loader = new CacheLoader() { + @Override + public final String load(final String key) { + return key.toUpperCase(); + } + }; + final LoadingCache cache = CacheBuilder.newBuilder().softValues().build(loader); + } + + @Test + public void whenNullValue_thenOptional() { + final CacheLoader> loader = new CacheLoader>() { + @Override + public final Optional load(final String key) { + return Optional.fromNullable(getSuffix(key)); + } + }; + final LoadingCache> cache = CacheBuilder.newBuilder().build(loader); + assertEquals("txt", cache.getUnchecked("text.txt").get()); + assertFalse(cache.getUnchecked("hello").isPresent()); + } + + @Test + public void whenLiveTimeEnd_thenRefresh() { + final CacheLoader loader = new CacheLoader() { + @Override + public final String load(final String key) { + return key.toUpperCase(); + } + }; + final LoadingCache cache = CacheBuilder.newBuilder().refreshAfterWrite(1, TimeUnit.MINUTES).build(loader); + } + + @Test + public void whenPreloadCache_thenUsePutAll() { + final CacheLoader loader = new CacheLoader() { + @Override + public final String load(final String key) { + return key.toUpperCase(); + } + }; + final LoadingCache cache = CacheBuilder.newBuilder().build(loader); + final Map map = new HashMap(); + map.put("first", "FIRST"); + map.put("second", "SECOND"); + cache.putAll(map); + assertEquals(2, cache.size()); + } + + @Test + public void whenEntryRemovedFromCache_thenNotify() { + final CacheLoader loader = new CacheLoader() { + @Override + public final String load(final String key) { + return key.toUpperCase(); + } + }; + final RemovalListener listener = new RemovalListener() { + @Override + public void onRemoval(final RemovalNotification n) { + if (n.wasEvicted()) { + final String cause = n.getCause().name(); + assertEquals(RemovalCause.SIZE.toString(), cause); + } + } + }; + final LoadingCache cache = CacheBuilder.newBuilder().maximumSize(3).removalListener(listener).build(loader); + cache.getUnchecked("first"); + cache.getUnchecked("second"); + cache.getUnchecked("third"); + cache.getUnchecked("last"); + assertEquals(3, cache.size()); + } + + // UTIL + + private String getSuffix(final String str) { + final int lastIndex = str.lastIndexOf('.'); + if (lastIndex == -1) + return null; + return str.substring(lastIndex + 1); + } + +} + + + diff --git a/guava/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsTest.java b/guava/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsTest.java new file mode 100644 index 0000000000..d44edc962c --- /dev/null +++ b/guava/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsTest.java @@ -0,0 +1,186 @@ +package org.baeldung.guava; + +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.util.Collection; +import java.util.List; + +import org.junit.Test; + +import com.google.common.base.Function; +import com.google.common.base.Functions; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import com.google.common.collect.Collections2; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + + +public class GuavaFilterTransformCollectionsTest { + + @Test + public void whenFilterWithCollections2_thenFiltered() { + final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom"); + final Collection result = Collections2.filter(names, Predicates.containsPattern("a")); + + assertEquals(2, result.size()); + assertThat(result, containsInAnyOrder("Jane", "Adam")); + + result.add("anna"); + assertEquals(5, names.size()); + result.remove("Adam"); + assertEquals(4, names.size()); + } + + @Test + public void whenFilterWithIterables_thenFiltered() { + final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom"); + final Iterable result = Iterables.filter(names, Predicates.containsPattern("a")); + + assertThat(result, containsInAnyOrder("Jane", "Adam")); + } + + @Test + public void whenFilterCollectionWithCustomPredicate_thenFiltered() { + final Predicate predicate = new Predicate() { + @Override + public final boolean apply(final String input) { + return input.startsWith("A") || input.startsWith("J"); + } + }; + + final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom"); + final Collection result = Collections2.filter(names, predicate); + + assertEquals(3, result.size()); + assertThat(result, containsInAnyOrder("John", "Jane", "Adam")); + } + + @Test + public void whenFilterUsingMultiplePredicates_thenFiltered() { + final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom"); + final Collection result = Collections2.filter(names, Predicates.or(Predicates.containsPattern("J"), Predicates.not(Predicates.containsPattern("a")))); + + assertEquals(3, result.size()); + assertThat(result, containsInAnyOrder("John", "Jane", "Tom")); + } + + @Test + public void whenRemoveNullFromCollection_thenRemoved() { + final List names = Lists.newArrayList("John", null, "Jane", null, "Adam", "Tom"); + final Collection result = Collections2.filter(names, Predicates.notNull()); + + assertEquals(4, result.size()); + assertThat(result, containsInAnyOrder("John", "Jane", "Adam", "Tom")); + } + + @Test + public void whenCheckAllElementsForCondition_thenChecked() { + final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom"); + + boolean result = Iterables.all(names, Predicates.containsPattern("n|m")); + assertTrue(result); + + result = Iterables.all(names, Predicates.containsPattern("a")); + assertFalse(result); + } + + @Test + public void whenTransformWithIterables_thenTransformed() { + final Function function = new Function() { + @Override + public final Integer apply(final String input) { + return input.length(); + } + }; + + final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom"); + final Iterable result = Iterables.transform(names, function); + + assertThat(result, contains(4, 4, 4, 3)); + } + + @Test + public void whenTransformWithCollections2_thenTransformed() { + final Function function = new Function() { + @Override + public final Integer apply(final String input) { + return input.length(); + } + }; + + final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom"); + final Collection result = Collections2.transform(names, function); + + assertEquals(4, result.size()); + assertThat(result, contains(4, 4, 4, 3)); + + result.remove(3); + assertEquals(3, names.size()); + } + + @Test + public void whenTransformUsingComposedFunction_thenTransformed() { + final Function f1 = new Function() { + @Override + public final Integer apply(final String input) { + return input.length(); + } + }; + + final Function f2 = new Function() { + @Override + public final Boolean apply(final Integer input) { + return input % 2 == 0; + } + }; + + final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom"); + final Collection result = Collections2.transform(names, Functions.compose(f2, f1)); + + assertEquals(4, result.size()); + assertThat(result, contains(true, true, true, false)); + } + + @Test + public void whenCreateFunctionFromPredicate_thenCreated() { + final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom"); + final Collection result = Collections2.transform(names, Functions.forPredicate(Predicates.containsPattern("m"))); + + assertEquals(4, result.size()); + assertThat(result, contains(false, false, true, true)); + } + + @Test + public void whenFilterAndTransformCollection_thenCorrect() { + final Predicate predicate = new Predicate() { + @Override + public final boolean apply(final String input) { + return input.startsWith("A") || input.startsWith("T"); + } + }; + + final Function func = new Function() { + @Override + public final Integer apply(final String input) { + return input.length(); + } + }; + + final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom"); + final Collection result = FluentIterable.from(names).filter(predicate).transform(func).toList(); + + assertEquals(2, result.size()); + assertThat(result, containsInAnyOrder(4, 3)); + } + + + +} +