@@ -0,0 +1,80 @@
1+package com.parseable.android
2+
3+import com.parseable.android.data.formatBytes
4+import org.junit.Assert.*
5+import org.junit.Test
6+
7+class FormatBytesTest {
8+
9+ @Test
10+ fun `null input returns null`() {
11+ assertNull(formatBytes(null))
12+ }
13+
14+ @Test
15+ fun `zero bytes`() {
16+ assertEquals("0 B", formatBytes("0"))
17+ }
18+
19+ @Test
20+ fun `small byte values`() {
21+ assertEquals("512 B", formatBytes("512"))
22+ assertEquals("1 B", formatBytes("1"))
23+ }
24+
25+ @Test
26+ fun `kilobytes`() {
27+ assertEquals("1.00 KB", formatBytes("1024"))
28+ assertEquals("1.50 KB", formatBytes("1536"))
29+ }
30+
31+ @Test
32+ fun `megabytes`() {
33+ assertEquals("1.00 MB", formatBytes("1048576"))
34+ assertEquals("5.25 MB", formatBytes("5505024"))
35+ }
36+
37+ @Test
38+ fun `gigabytes`() {
39+ assertEquals("1.00 GB", formatBytes("1073741824"))
40+ assertEquals("2.50 GB", formatBytes("2684354560"))
41+ }
42+
43+ @Test
44+ fun `terabytes`() {
45+ assertEquals("1.00 TB", formatBytes("1099511627776"))
46+ }
47+
48+ @Test
49+ fun `large values use no decimals`() {
50+ // 150 GB = 161061273600
51+ assertEquals("150 GB", formatBytes("161061273600"))
52+ }
53+
54+ @Test
55+ fun `mid-range values use one decimal`() {
56+ // 15.5 MB = 16252928
57+ assertEquals("15.5 MB", formatBytes("16252928"))
58+ }
59+
60+ @Test
61+ fun `non-numeric string passes through unchanged`() {
62+ assertEquals("already formatted", formatBytes("already formatted"))
63+ assertEquals("1.5 GiB", formatBytes("1.5 GiB"))
64+ }
65+
66+ @Test
67+ fun `negative value passes through unchanged`() {
68+ assertEquals("-1024", formatBytes("-1024"))
69+ }
70+
71+ @Test
72+ fun `whitespace is trimmed before parsing`() {
73+ assertEquals("1.00 KB", formatBytes(" 1024 "))
74+ }
75+
76+ @Test
77+ fun `fractional bytes from API`() {
78+ assertEquals("1.50 KB", formatBytes("1536.0"))
79+ }
80+}