commit 3d6f218e2fd01fb0b764f010cc0b58483ce90d46 Author: Edward Cheng Date: Tue Sep 26 20:01:08 2023 +1000 Init Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a91c35d --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store +/.idea/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..0d7425b --- /dev/null +++ b/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + org.example + canva-interview + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + + org.junit.jupiter + junit-jupiter-api + 5.10.0 + test + + + org.mockito + mockito-junit-jupiter + 5.5.0 + test + + + \ No newline at end of file diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java new file mode 100644 index 0000000..407f157 --- /dev/null +++ b/src/main/java/org/example/Main.java @@ -0,0 +1,7 @@ +package org.example; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/VideoCache.java b/src/main/java/org/example/VideoCache.java new file mode 100644 index 0000000..38496ec --- /dev/null +++ b/src/main/java/org/example/VideoCache.java @@ -0,0 +1,11 @@ +package org.example; + +import org.example.data.VideoMap; + +public interface VideoCache { + void set(String videoId, String videoContent); + + String get(String videoId); + + VideoMap getData(); +} diff --git a/src/main/java/org/example/VideoCache2.java b/src/main/java/org/example/VideoCache2.java new file mode 100644 index 0000000..62262a8 --- /dev/null +++ b/src/main/java/org/example/VideoCache2.java @@ -0,0 +1,11 @@ +package org.example; + +import org.example.data.VideoMap2; + +public interface VideoCache2 { + void set(String videoId, String videoContent); + + String get(String videoId); + + VideoMap2 getData(); +} diff --git a/src/main/java/org/example/VideoCacheImpl.java b/src/main/java/org/example/VideoCacheImpl.java new file mode 100644 index 0000000..85ceba8 --- /dev/null +++ b/src/main/java/org/example/VideoCacheImpl.java @@ -0,0 +1,23 @@ +package org.example; + +import org.example.data.VideoMap; + +public class VideoCacheImpl implements VideoCache { + private VideoMap data; + + public VideoCacheImpl() { + data = new VideoMap(); + } + + public void set(String videoId, String videoContent) { + data.put(videoId, videoContent); + } + + public String get(String videoId) { + return data.get(videoId); + } + + public VideoMap getData() { + return data; + } +} diff --git a/src/main/java/org/example/VideoCacheImpl2.java b/src/main/java/org/example/VideoCacheImpl2.java new file mode 100644 index 0000000..a983b5c --- /dev/null +++ b/src/main/java/org/example/VideoCacheImpl2.java @@ -0,0 +1,23 @@ +package org.example; + +import org.example.data.VideoMap2; + +public class VideoCacheImpl2 implements VideoCache2 { + private VideoMap2 data; + + public VideoCacheImpl2() { + data = new VideoMap2(); + } + + public void set(String videoId, String videoContent) { + data.put(videoId, videoContent); + } + + public String get(String videoId) { + return data.get(videoId); + } + + public VideoMap2 getData() { + return data; + } +} diff --git a/src/main/java/org/example/data/VideoMap.java b/src/main/java/org/example/data/VideoMap.java new file mode 100644 index 0000000..0cf57ba --- /dev/null +++ b/src/main/java/org/example/data/VideoMap.java @@ -0,0 +1,40 @@ +package org.example.data; + +public class VideoMap { + String[] data; + String[] keys; + int size; + + public VideoMap() { + data = new String[1000]; + keys = new String[1000]; + size = 0; + } + + public void put(String key, String value) { + keys[size] = key; + data[size] = value; + size++; + } + + public String get(String key) { + for (int i = 0; i < size; i++) { + if (keys[i].equals(key)) { + return data[i]; + } + } + return null; + } + + public String[] getData() { + return data; + } + + public String[] getKeys() { + return keys; + } + + public int getSize() { + return size; + } +} diff --git a/src/main/java/org/example/data/VideoMap2.java b/src/main/java/org/example/data/VideoMap2.java new file mode 100644 index 0000000..437d21c --- /dev/null +++ b/src/main/java/org/example/data/VideoMap2.java @@ -0,0 +1,70 @@ +package org.example.data; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +public class VideoMap2 { + private Entry[] data; + private int size; + + public VideoMap2() { + data = new Entry[1000]; + size = 0; + } + + public void put(String key, String value) { + int index = getIndexFromKey(key); + Entry entry = new Entry(key, value); + data[index] = entry; + size++; + } + + public String get(String key) { + int index = getIndexFromKey(key); + Entry entry = data[index]; + if (entry != null && entry.getKey().equals(key)) { + return entry.getValue(); + } + return null; + } + + public int getSize() { + return size; + } + + public Entry[] getData() { + return data; + } + + private int getIndexFromKey(String key) { + int hashCode = key.hashCode(); + return (hashCode & 0x7FFFFFFF) % data.length; + } + + public static class Entry { + String key; + String value; + + public Entry(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } +} diff --git a/src/test/java/org/example/VideoCacheTest.java b/src/test/java/org/example/VideoCacheTest.java new file mode 100644 index 0000000..b4fee76 --- /dev/null +++ b/src/test/java/org/example/VideoCacheTest.java @@ -0,0 +1,42 @@ +package org.example; + +import org.example.data.VideoMap; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class VideoCacheTest { + private VideoCache videoCache = new VideoCacheImpl(); + + @Test + public void testSet() { + videoCache.set("0001", "content0001"); + + VideoMap data = videoCache.getData(); + + assertEquals(1, data.getSize()); + assertEquals("0001", data.getKeys()[0]); + assertEquals("content0001", data.getData()[0]); + } + + @Test + public void testGet() { + String value = videoCache.get("0001"); + String value2 = videoCache.get("0002"); + +// assertEquals("content0001", value); + assertNull(value); + assertNull(value2); + } + + @Test + public void testGetWithData() { + String value = videoCache.get("0001"); + String value2 = videoCache.get("0002"); + +// assertEquals("content0001", value); + assertNull(value); + assertNull(value2); + } +} diff --git a/src/test/java/org/example/VideoCacheTest2.java b/src/test/java/org/example/VideoCacheTest2.java new file mode 100644 index 0000000..9d6cd66 --- /dev/null +++ b/src/test/java/org/example/VideoCacheTest2.java @@ -0,0 +1,42 @@ +package org.example; + +import org.example.data.VideoMap2; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class VideoCacheTest2 { + private VideoCache2 videoCache = new VideoCacheImpl2(); + + @Test + public void testSet() { + videoCache.set("0001", "content0001"); + + VideoMap2 data = videoCache.getData(); + int index = ("0001".hashCode() & 0x7FFFFFFF) % data.getData().length; + + assertEquals(1, data.getSize()); + assertEquals("0001", data.getData()[index].getKey()); + assertEquals("content0001", data.getData()[index].getValue()); + } + + @Test + public void testGet() { + String value = videoCache.get("0001"); + String value2 = videoCache.get("0002"); + + assertNull(value); + assertNull(value2); + } + +// @Test +// public void testGetWithData() { +// String value = videoCache.get("0001"); +// String value2 = videoCache.get("0002"); +// +//// assertEquals("content0001", value); +// assertNull(value); +// assertNull(value2); +// } +}