You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1407 lines
29 KiB

  1. package bptree
  2. import (
  3. "encoding/hex"
  4. "runtime/debug"
  5. "sort"
  6. "sync"
  7. "testing"
  8. crand "crypto/rand"
  9. "encoding/binary"
  10. mrand "math/rand"
  11. )
  12. var rand *mrand.Rand
  13. func init() {
  14. seed := make([]byte, 8)
  15. if _, err := crand.Read(seed); err == nil {
  16. rand = ThreadSafeRand(int64(binary.BigEndian.Uint64(seed)))
  17. } else {
  18. panic(err)
  19. }
  20. }
  21. func randslice(length int) []byte {
  22. return RandSlice(length)
  23. }
  24. func randstr(length int) String {
  25. return String(RandStr(length))
  26. }
  27. type Strings []String
  28. func (self Strings) Len() int {
  29. return len(self)
  30. }
  31. func (self Strings) Less(i, j int) bool {
  32. return self[i].Less(self[j])
  33. }
  34. func (self Strings) Swap(i, j int) {
  35. self[i], self[j] = self[j], self[i]
  36. }
  37. type record struct {
  38. key String
  39. value ItemValue
  40. }
  41. type records []*record
  42. func (self records) Len() int {
  43. return len(self)
  44. }
  45. func (self records) Less(i, j int) bool {
  46. return self[i].key.Less(self[j].key)
  47. }
  48. func (self records) Swap(i, j int) {
  49. self[i], self[j] = self[j], self[i]
  50. }
  51. func BenchmarkBpTree(b *testing.B) {
  52. b.StopTimer()
  53. recs := make(records, 100)
  54. ranrec := func() *record {
  55. return &record{randstr(20), randstr(20)}
  56. }
  57. for i := range recs {
  58. recs[i] = ranrec()
  59. }
  60. b.StartTimer()
  61. for i := 0; i < b.N; i++ {
  62. t := NewBpTree(23)
  63. for _, r := range recs {
  64. t.Add(r.key, r.value)
  65. }
  66. for _, r := range recs {
  67. t.RemoveWhere(r.key, func(value ItemValue) bool { return true })
  68. }
  69. }
  70. }
  71. func TestAddHasCountFindIterateRemove(t *testing.T) {
  72. ranrec := func() *record {
  73. return &record{
  74. randstr(12),
  75. randstr(12),
  76. }
  77. }
  78. test := func(bpt *BpTree) {
  79. var err error
  80. recs := make(records, 128)
  81. new_recs := make(records, 128)
  82. for i := range recs {
  83. r := ranrec()
  84. recs[i] = r
  85. new_recs[i] = &record{r.key, randstr(12)}
  86. err = bpt.Add(r.key, r.value)
  87. if err != nil {
  88. t.Error(err)
  89. }
  90. }
  91. for i, r := range recs {
  92. if has := bpt.Has(r.key); !has {
  93. t.Error(bpt, "Missing key")
  94. }
  95. if has := bpt.Has(randstr(10)); has {
  96. t.Error("Table has extra key")
  97. }
  98. if count := bpt.Count(r.key); count != 1 {
  99. t.Error(bpt, "Missing key")
  100. }
  101. if count := bpt.Count(randstr(10)); count != 0 {
  102. t.Error("Table has extra key")
  103. }
  104. for k, v, next := bpt.Find(r.key)(); next != nil; k, v, next = next() {
  105. if !k.Equals(r.key) {
  106. t.Error(bpt, "Find Failed Key Error")
  107. }
  108. if !v.(String).Equals(r.value) {
  109. t.Error(bpt, "Find Failed Value Error")
  110. }
  111. }
  112. err = bpt.Replace(r.key, func(value ItemValue) bool { return true }, new_recs[i].value)
  113. if err != nil {
  114. t.Error(err)
  115. }
  116. }
  117. sort.Sort(recs)
  118. sort.Sort(new_recs)
  119. i := 0
  120. for k, v, next := bpt.Iterate()(); next != nil; k, v, next = next() {
  121. if !recs[i].key.Equals(k) {
  122. t.Error("iterate error wrong key")
  123. }
  124. if !new_recs[i].value.Equals(v.(String)) {
  125. t.Error("iterate error wrong value")
  126. }
  127. i++
  128. }
  129. i = len(recs) - 1
  130. for k, v, next := bpt.Backward()(); next != nil; k, v, next = next() {
  131. if !recs[i].key.Equals(k) {
  132. t.Error("iterate error wrong key")
  133. }
  134. if !new_recs[i].value.Equals(v.(String)) {
  135. t.Error("iterate error wrong value")
  136. }
  137. i--
  138. }
  139. i = 0
  140. for k, next := bpt.Keys()(); next != nil; k, next = next() {
  141. if !recs[i].key.Equals(k) {
  142. t.Error("iterate error wrong key")
  143. }
  144. i++
  145. }
  146. i = 7
  147. for k, v, next := bpt.Range(recs[i].key, recs[i+(len(recs)/2)].key)(); next != nil; k, v, next = next() {
  148. if !recs[i].key.Equals(k) {
  149. t.Error("iterate error wrong key")
  150. }
  151. if !new_recs[i].value.Equals(v.(String)) {
  152. t.Error("iterate error wrong value")
  153. }
  154. i++
  155. }
  156. for k, v, next := bpt.Range(recs[i].key, recs[7].key)(); next != nil; k, v, next = next() {
  157. if !recs[i].key.Equals(k) {
  158. t.Error("iterate error wrong key")
  159. }
  160. if !new_recs[i].value.Equals(v.(String)) {
  161. t.Error("iterate error wrong value", k, v, recs[i].value, new_recs[i].value)
  162. }
  163. i--
  164. }
  165. for i, r := range recs {
  166. if has := bpt.Has(r.key); !has {
  167. t.Error(bpt, "Missing key")
  168. }
  169. if count := bpt.Count(r.key); count != 1 {
  170. t.Error(bpt, "Missing key")
  171. }
  172. if err := bpt.RemoveWhere(r.key, func(value ItemValue) bool { return true }); err != nil {
  173. t.Fatal(bpt, err)
  174. }
  175. if has := bpt.Has(r.key); has {
  176. t.Error("Table has extra key")
  177. }
  178. for _, x := range recs[i+1:] {
  179. if has := bpt.Has(x.key); !has {
  180. t.Error(bpt, "Missing key", x.key)
  181. }
  182. }
  183. }
  184. }
  185. for i := 2; i < 64; i++ {
  186. test(NewBpTree(i))
  187. }
  188. }
  189. func TestBpMap(t *testing.T) {
  190. ranrec := func() *record {
  191. return &record{
  192. randstr(12),
  193. randstr(12),
  194. }
  195. }
  196. test := func(table MapOperable) {
  197. recs := make(records, 400)
  198. for i := range recs {
  199. r := ranrec()
  200. recs[i] = r
  201. err := table.Put(r.key, String(""))
  202. if err != nil {
  203. t.Error(err)
  204. }
  205. err = table.Put(r.key, r.value)
  206. if err != nil {
  207. t.Error(err)
  208. }
  209. }
  210. for _, r := range recs {
  211. if has := table.Has(r.key); !has {
  212. t.Error(table, "Missing key")
  213. }
  214. if has := table.Has(randstr(12)); has {
  215. t.Error("Table has extra key")
  216. }
  217. if val, err := table.Get(r.key); err != nil {
  218. t.Error(err)
  219. } else if !(val.(String)).Equals(r.value) {
  220. t.Error("wrong value")
  221. }
  222. }
  223. for i, x := range recs {
  224. if val, err := table.Remove(x.key); err != nil {
  225. t.Error(err)
  226. } else if !(val.(String)).Equals(x.value) {
  227. t.Error("wrong value")
  228. }
  229. for _, r := range recs[i+1:] {
  230. if has := table.Has(r.key); !has {
  231. t.Error("Missing key")
  232. }
  233. if has := table.Has(randstr(12)); has {
  234. t.Error("Table has extra key")
  235. }
  236. if val, err := table.Get(r.key); err != nil {
  237. t.Error(err)
  238. } else if !(val.(String)).Equals(r.value) {
  239. t.Error("wrong value")
  240. }
  241. }
  242. }
  243. }
  244. test(NewBpMap(23))
  245. }
  246. func Test_get_start(t *testing.T) {
  247. root := NewLeaf(2)
  248. root, err := root.put(Int(1), Int(1))
  249. if err != nil {
  250. t.Error(err)
  251. }
  252. root, err = root.put(Int(5), Int(3))
  253. if err != nil {
  254. t.Error(err)
  255. }
  256. root, err = root.put(Int(3), Int(2))
  257. if err != nil {
  258. t.Error(err)
  259. }
  260. t.Log(root)
  261. t.Log(root.pointers[0])
  262. t.Log(root.pointers[1])
  263. i, n := root.get_start(Int(1))
  264. if n != root.pointers[0] {
  265. t.Error("wrong node from get_start")
  266. }
  267. if i != 0 {
  268. t.Error("wrong index from get_start")
  269. }
  270. i, n = root.get_start(Int(3))
  271. if n != root.pointers[0] {
  272. t.Error("wrong node from get_start")
  273. }
  274. if i != 1 {
  275. t.Error("wrong index from get_start")
  276. }
  277. i, n = root.get_start(Int(5))
  278. if n != root.pointers[1] {
  279. t.Error("wrong node from get_start")
  280. }
  281. if i != 0 {
  282. t.Error("wrong index from get_start")
  283. }
  284. i, n = root.get_start(Int(2))
  285. if n != root.pointers[0] {
  286. t.Error("wrong node from get_start")
  287. }
  288. if i != 1 {
  289. t.Error("wrong index from get_start")
  290. }
  291. i, n = root.get_start(Int(4))
  292. t.Log(n)
  293. if n != root.pointers[1] {
  294. t.Error("wrong node from get_start")
  295. }
  296. if i != 0 {
  297. t.Error("wrong index from get_start")
  298. }
  299. i, n = root.get_start(Int(0))
  300. if n != root.pointers[0] {
  301. t.Error("wrong node from get_start")
  302. }
  303. if i != 0 {
  304. t.Error("wrong index from get_start")
  305. }
  306. i, n = root.get_start(Int(5))
  307. if n != root.pointers[1] {
  308. t.Error("wrong node from get_start")
  309. }
  310. if i != 0 {
  311. t.Error("wrong index from get_start")
  312. }
  313. }
  314. func Test_get_end(t *testing.T) {
  315. root := NewLeaf(3)
  316. root, err := root.put(Int(1), Int(1))
  317. if err != nil {
  318. t.Fatal(err)
  319. }
  320. root, err = root.put(Int(4), Int(4))
  321. if err != nil {
  322. t.Fatal(err)
  323. }
  324. root, err = root.put(Int(3), Int(3))
  325. if err != nil {
  326. t.Fatal(err)
  327. }
  328. root, err = root.put(Int(8), Int(8))
  329. if err != nil {
  330. t.Fatal(err)
  331. }
  332. root, err = root.put(Int(9), Int(9))
  333. if err != nil {
  334. t.Fatal(err)
  335. }
  336. root, err = root.put(Int(10), Int(10))
  337. if err != nil {
  338. t.Fatal(err)
  339. }
  340. root, err = root.put(Int(6), Int(6))
  341. if err != nil {
  342. t.Fatal(err)
  343. }
  344. root, err = root.put(Int(7), Int(7))
  345. if err != nil {
  346. t.Fatal(err)
  347. }
  348. root, err = root.put(Int(5), Int(5))
  349. if err != nil {
  350. t.Fatal(err)
  351. }
  352. t.Log(root)
  353. t.Log(root.pointers[0])
  354. t.Log(root.pointers[1])
  355. printTree(root, "")
  356. }
  357. func Test_put_no_root_split(t *testing.T) {
  358. a := NewLeaf(2)
  359. if err := a.put_kv(Int(1), Int(1)); err != nil {
  360. t.Error(err)
  361. }
  362. p, err := a.put(Int(1), Int(2))
  363. if err != nil {
  364. t.Error(err)
  365. } else {
  366. if p != a {
  367. t.Errorf("p != a")
  368. }
  369. if !p.has(Int(1)) {
  370. t.Error("p didn't have the right keys", p)
  371. }
  372. }
  373. p, err = a.put(Int(1), Int(3))
  374. t.Log(a)
  375. printTree(a, "")
  376. if err != nil {
  377. t.Error(err)
  378. } else {
  379. if p != a {
  380. t.Errorf("p != a")
  381. }
  382. if !p.has(Int(1)) {
  383. t.Error("p didn't have the right keys", p)
  384. }
  385. t.Log(p)
  386. t.Log(p.getNext())
  387. }
  388. }
  389. func Test_put_root_split(t *testing.T) {
  390. a := NewLeaf(2)
  391. p, err := a.put(Int(1), Int(1))
  392. if err != nil {
  393. t.Error(err)
  394. } else {
  395. if p != a {
  396. t.Errorf("p != a")
  397. }
  398. if !p.has(Int(1)) {
  399. t.Error("p didn't have the right keys", p)
  400. }
  401. }
  402. p, err = a.put(Int(3), Int(3))
  403. if err != nil {
  404. t.Error(err)
  405. } else {
  406. if p != a {
  407. t.Errorf("p != a")
  408. }
  409. if !p.has(Int(1)) || !p.has(Int(3)) {
  410. t.Error("p didn't have the right keys", p)
  411. }
  412. }
  413. p, err = a.put(Int(2), Int(2))
  414. if err != nil {
  415. t.Error(err)
  416. } else {
  417. if p == a {
  418. t.Errorf("p == a")
  419. }
  420. if !p.has(Int(1)) || !p.has(Int(3)) {
  421. t.Error("p didn't have the right keys", p)
  422. }
  423. if len(p.pointers) != 2 {
  424. t.Error("p didn't have right number of pointers", p)
  425. }
  426. if !p.pointers[0].has(Int(1)) || !p.pointers[0].has(Int(2)) {
  427. t.Error("p.pointers[0] didn't have the right keys", p.pointers[0])
  428. }
  429. if !p.pointers[1].has(Int(3)) {
  430. t.Error("p.pointers[1] didn't have the right keys", p.pointers[1])
  431. }
  432. t.Log(p)
  433. t.Log(p.pointers[0])
  434. t.Log(p.pointers[1])
  435. }
  436. }
  437. func Test_internal_insert_no_split(t *testing.T) {
  438. a := NewInternal(3)
  439. leaf := NewLeaf(1)
  440. if err := leaf.put_kv(Int(1), Int(1)); err != nil {
  441. t.Error(err)
  442. }
  443. if err := a.put_kp(Int(1), leaf); err != nil {
  444. t.Error(err)
  445. }
  446. if err := a.put_kp(Int(5), nil); err != nil {
  447. t.Error(err)
  448. }
  449. p, q, err := a.internal_insert(Int(2), nil)
  450. if err != nil {
  451. t.Error(err)
  452. } else {
  453. if p != a {
  454. t.Errorf("p != a")
  455. }
  456. if q != nil {
  457. t.Errorf("q != nil")
  458. }
  459. if !p.has(Int(1)) || !p.has(Int(2)) || !p.has(Int(5)) {
  460. t.Error("p didn't have the right keys", p)
  461. }
  462. }
  463. }
  464. func Test_internal_insert_split_less(t *testing.T) {
  465. a := NewInternal(3)
  466. leaf := NewLeaf(1)
  467. if err := leaf.put_kv(Int(1), Int(1)); err != nil {
  468. t.Error(err)
  469. }
  470. if err := a.put_kp(Int(1), leaf); err != nil {
  471. t.Error(err)
  472. }
  473. if err := a.put_kp(Int(3), nil); err != nil {
  474. t.Error(err)
  475. }
  476. if err := a.put_kp(Int(5), nil); err != nil {
  477. t.Error(err)
  478. }
  479. p, q, err := a.internal_insert(Int(2), nil)
  480. if err != nil {
  481. t.Error(err)
  482. } else {
  483. if p != a {
  484. t.Errorf("p != a")
  485. }
  486. if q == nil {
  487. t.Errorf("q == nil")
  488. }
  489. if !p.has(Int(1)) || !p.has(Int(2)) {
  490. t.Error("p didn't have the right keys", p)
  491. }
  492. if !q.has(Int(3)) || !q.has(Int(5)) {
  493. t.Error("q didn't have the right keys", q)
  494. }
  495. }
  496. }
  497. func Test_internal_split_less(t *testing.T) {
  498. a := NewInternal(3)
  499. if err := a.put_kp(Int(1), nil); err != nil {
  500. t.Error(err)
  501. }
  502. if err := a.put_kp(Int(3), nil); err != nil {
  503. t.Error(err)
  504. }
  505. if err := a.put_kp(Int(5), nil); err != nil {
  506. t.Error(err)
  507. }
  508. p, q, err := a.internal_split(Int(2), nil)
  509. if err != nil {
  510. t.Error(err)
  511. } else {
  512. if p != a {
  513. t.Errorf("p != a")
  514. }
  515. if q == nil {
  516. t.Errorf("q == nil")
  517. }
  518. if !p.has(Int(1)) || !p.has(Int(2)) {
  519. t.Error("p didn't have the right keys", p)
  520. }
  521. if !q.has(Int(3)) || !q.has(Int(5)) {
  522. t.Error("q didn't have the right keys", q)
  523. }
  524. }
  525. }
  526. func Test_internal_split_equal(t *testing.T) {
  527. a := NewInternal(3)
  528. if err := a.put_kp(Int(1), nil); err != nil {
  529. t.Error(err)
  530. }
  531. if err := a.put_kp(Int(3), nil); err != nil {
  532. t.Error(err)
  533. }
  534. if err := a.put_kp(Int(5), nil); err != nil {
  535. t.Error(err)
  536. }
  537. p, q, err := a.internal_split(Int(3), nil)
  538. if err == nil {
  539. t.Error("split succeeded should have failed", p, q)
  540. }
  541. }
  542. func Test_internal_split_greater(t *testing.T) {
  543. a := NewInternal(3)
  544. if err := a.put_kp(Int(1), nil); err != nil {
  545. t.Error(err)
  546. }
  547. if err := a.put_kp(Int(3), nil); err != nil {
  548. t.Error(err)
  549. }
  550. if err := a.put_kp(Int(5), nil); err != nil {
  551. t.Error(err)
  552. }
  553. p, q, err := a.internal_split(Int(4), nil)
  554. if err != nil {
  555. t.Error(err)
  556. } else {
  557. if p != a {
  558. t.Errorf("p != a")
  559. }
  560. if q == nil {
  561. t.Errorf("q == nil")
  562. }
  563. if !p.has(Int(1)) || !p.has(Int(3)) || !p.has(Int(4)){
  564. t.Error("p didn't have the right keys", p)
  565. }
  566. if !q.has(Int(5)) {
  567. t.Error("q didn't have the right keys", q)
  568. }
  569. }
  570. }
  571. func Test_leaf_insert_no_split(t *testing.T) {
  572. a := NewLeaf(3)
  573. insert_linked_list_node(a, nil, nil)
  574. if err := a.put_kv(Int(1), Int(1)); err != nil {
  575. t.Error(err)
  576. }
  577. if err := a.put_kv(Int(3), Int(3)); err != nil {
  578. t.Error(err)
  579. }
  580. p, q, err := a.leaf_insert(Int(2), Int(2))
  581. if err != nil {
  582. t.Error(err)
  583. } else {
  584. if p != a {
  585. t.Errorf("p != a")
  586. }
  587. if q != nil {
  588. t.Errorf("q != nil")
  589. }
  590. if !p.has(Int(1)) || !p.has(Int(2)) || !p.has(Int(3)) {
  591. t.Error("p didn't have the right keys", p)
  592. }
  593. }
  594. }
  595. // tests the defer to split logic
  596. func Test_leaf_insert_split_less(t *testing.T) {
  597. a := NewLeaf(3)
  598. insert_linked_list_node(a, nil, nil)
  599. if err := a.put_kv(Int(1), Int(1)); err != nil {
  600. t.Error(err)
  601. }
  602. if err := a.put_kv(Int(3), Int(3)); err != nil {
  603. t.Error(err)
  604. }
  605. if err := a.put_kv(Int(5), Int(5)); err != nil {
  606. t.Error(err)
  607. }
  608. p, q, err := a.leaf_insert(Int(2), Int(2))
  609. if err != nil {
  610. t.Error(err)
  611. } else {
  612. if p != a {
  613. t.Errorf("p != a")
  614. }
  615. if q == nil {
  616. t.Errorf("q == nil")
  617. }
  618. if !p.has(Int(1)) || !p.has(Int(2)) {
  619. t.Error("p didn't have the right keys", p)
  620. }
  621. if !q.has(Int(3)) || !q.has(Int(5)) {
  622. t.Error("q didn't have the right keys", q)
  623. }
  624. }
  625. }
  626. func Test_leaf_split_less(t *testing.T) {
  627. a := NewLeaf(3)
  628. insert_linked_list_node(a, nil, nil)
  629. if err := a.put_kv(Int(1), Int(1)); err != nil {
  630. t.Error(err)
  631. }
  632. if err := a.put_kv(Int(3), Int(3)); err != nil {
  633. t.Error(err)
  634. }
  635. if err := a.put_kv(Int(5), Int(5)); err != nil {
  636. t.Error(err)
  637. }
  638. p, q, err := a.leaf_split(Int(2), Int(2))
  639. if err != nil {
  640. t.Error(err)
  641. } else {
  642. if p != a {
  643. t.Errorf("p != a")
  644. }
  645. if q == nil {
  646. t.Errorf("q == nil")
  647. }
  648. if !p.has(Int(1)) || !p.has(Int(2)) {
  649. t.Error("p didn't have the right keys", p)
  650. }
  651. if !q.has(Int(3)) || !q.has(Int(5)) {
  652. t.Error("q didn't have the right keys", q)
  653. }
  654. }
  655. }
  656. func Test_leaf_split_equal(t *testing.T) {
  657. a := NewLeaf(3)
  658. insert_linked_list_node(a, nil, nil)
  659. if err := a.put_kv(Int(1), Int(1)); err != nil {
  660. t.Error(err)
  661. }
  662. if err := a.put_kv(Int(3), Int(3)); err != nil {
  663. t.Error(err)
  664. }
  665. if err := a.put_kv(Int(5), Int(5)); err != nil {
  666. t.Error(err)
  667. }
  668. p, q, err := a.leaf_split(Int(3), Int(2))
  669. if err != nil {
  670. t.Error(err)
  671. } else {
  672. if p != a {
  673. t.Errorf("p != a")
  674. }
  675. if q == nil {
  676. t.Errorf("q == nil")
  677. }
  678. if !p.has(Int(1)) {
  679. t.Error("p didn't have the right keys", p)
  680. }
  681. if !q.has(Int(3)) || !q.has(Int(5)) {
  682. t.Error("q didn't have the right keys", q)
  683. }
  684. }
  685. }
  686. func Test_leaf_split_greater(t *testing.T) {
  687. a := NewLeaf(3)
  688. insert_linked_list_node(a, nil, nil)
  689. if err := a.put_kv(Int(1), Int(1)); err != nil {
  690. t.Error(err)
  691. }
  692. if err := a.put_kv(Int(3), Int(3)); err != nil {
  693. t.Error(err)
  694. }
  695. if err := a.put_kv(Int(5), Int(5)); err != nil {
  696. t.Error(err)
  697. }
  698. p, q, err := a.leaf_split(Int(4), Int(2))
  699. if err != nil {
  700. t.Error(err)
  701. } else {
  702. if p != a {
  703. t.Errorf("p != a")
  704. }
  705. if q == nil {
  706. t.Errorf("q == nil")
  707. }
  708. if !p.has(Int(1)) || !p.has(Int(3)) || !p.has(Int(4)) {
  709. t.Error("p didn't have the right keys", p)
  710. }
  711. if !q.has(Int(5)) {
  712. t.Error("q didn't have the right keys", q)
  713. }
  714. }
  715. }
  716. // tests the defer logic
  717. func Test_pure_leaf_insert_split_less(t *testing.T) {
  718. a := NewLeaf(2)
  719. insert_linked_list_node(a, nil, nil)
  720. b := NewLeaf(2)
  721. insert_linked_list_node(b, a, nil)
  722. c := NewLeaf(2)
  723. insert_linked_list_node(c, b, nil)
  724. d := NewLeaf(2)
  725. insert_linked_list_node(d, c, nil)
  726. if err := a.put_kv(Int(3), Int(1)); err != nil {
  727. t.Error(err)
  728. }
  729. if err := a.put_kv(Int(3), Int(2)); err != nil {
  730. t.Error(err)
  731. }
  732. if err := b.put_kv(Int(3), Int(3)); err != nil {
  733. t.Error(err)
  734. }
  735. if err := b.put_kv(Int(3), Int(4)); err != nil {
  736. t.Error(err)
  737. }
  738. if err := c.put_kv(Int(3), Int(5)); err != nil {
  739. t.Error(err)
  740. }
  741. if err := c.put_kv(Int(3), Int(6)); err != nil {
  742. t.Error(err)
  743. }
  744. if err := d.put_kv(Int(4), Int(6)); err != nil {
  745. t.Error(err)
  746. }
  747. p, q, err := a.leaf_insert(Int(2), Int(1))
  748. if err != nil {
  749. t.Error(err)
  750. } else {
  751. if q != a {
  752. t.Errorf("q != a")
  753. }
  754. if p == nil || len(p.keys) != 1 || !p.keys[0].Equals(Int(2)) {
  755. t.Errorf("p did not contain the right key")
  756. }
  757. if p.getPrev() != nil {
  758. t.Errorf("expected p.prev == nil")
  759. }
  760. if p.getNext() != a {
  761. t.Errorf("expected p.next == a")
  762. }
  763. if a.getPrev() != p {
  764. t.Errorf("expected a.prev == p")
  765. }
  766. if a.getNext() != b {
  767. t.Errorf("expected a.next == b")
  768. }
  769. if b.getPrev() != a {
  770. t.Errorf("expected b.prev == a")
  771. }
  772. if b.getNext() != c {
  773. t.Errorf("expected b.next == c")
  774. }
  775. if c.getPrev() != b {
  776. t.Errorf("expected c.prev == b")
  777. }
  778. if c.getNext() != d {
  779. t.Errorf("expected c.next == d")
  780. }
  781. if d.getPrev() != c {
  782. t.Errorf("expected d.prev == c")
  783. }
  784. if d.getNext() != nil {
  785. t.Errorf("expected d.next == nil")
  786. }
  787. }
  788. }
  789. func Test_pure_leaf_split_less(t *testing.T) {
  790. a := NewLeaf(2)
  791. insert_linked_list_node(a, nil, nil)
  792. b := NewLeaf(2)
  793. insert_linked_list_node(b, a, nil)
  794. c := NewLeaf(2)
  795. insert_linked_list_node(c, b, nil)
  796. d := NewLeaf(2)
  797. insert_linked_list_node(d, c, nil)
  798. if err := a.put_kv(Int(3), Int(1)); err != nil {
  799. t.Error(err)
  800. }
  801. if err := a.put_kv(Int(3), Int(2)); err != nil {
  802. t.Error(err)
  803. }
  804. if err := b.put_kv(Int(3), Int(3)); err != nil {
  805. t.Error(err)
  806. }
  807. if err := b.put_kv(Int(3), Int(4)); err != nil {
  808. t.Error(err)
  809. }
  810. if err := c.put_kv(Int(3), Int(5)); err != nil {
  811. t.Error(err)
  812. }
  813. if err := c.put_kv(Int(3), Int(6)); err != nil {
  814. t.Error(err)
  815. }
  816. if err := d.put_kv(Int(4), Int(6)); err != nil {
  817. t.Error(err)
  818. }
  819. p, q, err := a.pure_leaf_split(Int(2), Int(1))
  820. if err != nil {
  821. t.Error(err)
  822. } else {
  823. if q != a {
  824. t.Errorf("q != a")
  825. }
  826. if p == nil || len(p.keys) != 1 || !p.keys[0].Equals(Int(2)) {
  827. t.Errorf("p did not contain the right key")
  828. }
  829. if p.getPrev() != nil {
  830. t.Errorf("expected p.prev == nil")
  831. }
  832. if p.getNext() != a {
  833. t.Errorf("expected p.next == a")
  834. }
  835. if a.getPrev() != p {
  836. t.Errorf("expected a.prev == p")
  837. }
  838. if a.getNext() != b {
  839. t.Errorf("expected a.next == b")
  840. }
  841. if b.getPrev() != a {
  842. t.Errorf("expected b.prev == a")
  843. }
  844. if b.getNext() != c {
  845. t.Errorf("expected b.next == c")
  846. }
  847. if c.getPrev() != b {
  848. t.Errorf("expected c.prev == b")
  849. }
  850. if c.getNext() != d {
  851. t.Errorf("expected c.next == d")
  852. }
  853. if d.getPrev() != c {
  854. t.Errorf("expected d.prev == c")
  855. }
  856. if d.getNext() != nil {
  857. t.Errorf("expected d.next == nil")
  858. }
  859. }
  860. }
  861. func Test_pure_leaf_split_equal(t *testing.T) {
  862. a := NewLeaf(2)
  863. insert_linked_list_node(a, nil, nil)
  864. b := NewLeaf(2)
  865. insert_linked_list_node(b, a, nil)
  866. c := NewLeaf(2)
  867. insert_linked_list_node(c, b, nil)
  868. d := NewLeaf(2)
  869. insert_linked_list_node(d, c, nil)
  870. if err := a.put_kv(Int(3), Int(1)); err != nil {
  871. t.Error(err)
  872. }
  873. if err := a.put_kv(Int(3), Int(2)); err != nil {
  874. t.Error(err)
  875. }
  876. if err := b.put_kv(Int(3), Int(3)); err != nil {
  877. t.Error(err)
  878. }
  879. if err := b.put_kv(Int(3), Int(4)); err != nil {
  880. t.Error(err)
  881. }
  882. if err := c.put_kv(Int(3), Int(5)); err != nil {
  883. t.Error(err)
  884. }
  885. if err := d.put_kv(Int(4), Int(6)); err != nil {
  886. t.Error(err)
  887. }
  888. p, q, err := a.pure_leaf_split(Int(3), Int(1))
  889. if err != nil {
  890. t.Error(err)
  891. } else {
  892. if p != a {
  893. t.Errorf("p != a")
  894. }
  895. if q != nil {
  896. t.Errorf("q != nil")
  897. }
  898. if a.getPrev() != nil {
  899. t.Errorf("expected a.prev == nil")
  900. }
  901. if a.getNext() != b {
  902. t.Errorf("expected a.next == b")
  903. }
  904. if b.getPrev() != a {
  905. t.Errorf("expected b.prev == a")
  906. }
  907. if b.getNext() != c {
  908. t.Errorf("expected b.next == c")
  909. }
  910. if c.getPrev() != b {
  911. t.Errorf("expected c.prev == b")
  912. }
  913. if c.getNext() != d {
  914. t.Errorf("expected c.next == d")
  915. }
  916. if d.getPrev() != c {
  917. t.Errorf("expected d.prev == c")
  918. }
  919. if d.getNext() != nil {
  920. t.Errorf("expected d.next == nil")
  921. }
  922. }
  923. }
  924. func Test_pure_leaf_split_greater(t *testing.T) {
  925. a := NewLeaf(2)
  926. insert_linked_list_node(a, nil, nil)
  927. b := NewLeaf(2)
  928. insert_linked_list_node(b, a, nil)
  929. c := NewLeaf(2)
  930. insert_linked_list_node(c, b, nil)
  931. d := NewLeaf(2)
  932. insert_linked_list_node(d, c, nil)
  933. if err := a.put_kv(Int(3), Int(1)); err != nil {
  934. t.Error(err)
  935. }
  936. if err := a.put_kv(Int(3), Int(2)); err != nil {
  937. t.Error(err)
  938. }
  939. if err := b.put_kv(Int(3), Int(3)); err != nil {
  940. t.Error(err)
  941. }
  942. if err := b.put_kv(Int(3), Int(4)); err != nil {
  943. t.Error(err)
  944. }
  945. if err := c.put_kv(Int(3), Int(5)); err != nil {
  946. t.Error(err)
  947. }
  948. if err := d.put_kv(Int(5), Int(6)); err != nil {
  949. t.Error(err)
  950. }
  951. p, q, err := a.pure_leaf_split(Int(4), Int(1))
  952. if err != nil {
  953. t.Error(err)
  954. } else {
  955. if p != a {
  956. t.Errorf("p != a")
  957. }
  958. if q == nil || len(q.keys) != 1 || !q.keys[0].Equals(Int(4)) {
  959. t.Errorf("q != nil")
  960. }
  961. if a.getPrev() != nil {
  962. t.Errorf("expected a.prev == nil")
  963. }
  964. if a.getNext() != b {
  965. t.Errorf("expected a.next == b")
  966. }
  967. if b.getPrev() != a {
  968. t.Errorf("expected b.prev == a")
  969. }
  970. if b.getNext() != c {
  971. t.Errorf("expected b.next == c")
  972. }
  973. if c.getPrev() != b {
  974. t.Errorf("expected c.prev == b")
  975. }
  976. if c.getNext() != q {
  977. t.Errorf("expected c.next == q")
  978. }
  979. if q.getPrev() != c {
  980. t.Errorf("expected q.prev == c")
  981. }
  982. if q.getNext() != d {
  983. t.Errorf("expected q.next == d")
  984. }
  985. if d.getPrev() != q {
  986. t.Errorf("expected d.prev == q")
  987. }
  988. if d.getNext() != nil {
  989. t.Errorf("expected d.next == nil")
  990. }
  991. }
  992. }
  993. func Test_find_end_of_pure_run(t *testing.T) {
  994. a := NewLeaf(2)
  995. insert_linked_list_node(a, nil, nil)
  996. b := NewLeaf(2)
  997. insert_linked_list_node(b, a, nil)
  998. c := NewLeaf(2)
  999. insert_linked_list_node(c, b, nil)
  1000. d := NewLeaf(2)
  1001. insert_linked_list_node(d, c, nil)
  1002. if err := a.put_kv(Int(3), Int(1)); err != nil {
  1003. t.Error(err)
  1004. }
  1005. if err := a.put_kv(Int(3), Int(2)); err != nil {
  1006. t.Error(err)
  1007. }
  1008. if err := b.put_kv(Int(3), Int(3)); err != nil {
  1009. t.Error(err)
  1010. }
  1011. if err := b.put_kv(Int(3), Int(4)); err != nil {
  1012. t.Error(err)
  1013. }
  1014. if err := c.put_kv(Int(3), Int(5)); err != nil {
  1015. t.Error(err)
  1016. }
  1017. if err := c.put_kv(Int(3), Int(6)); err != nil {
  1018. t.Error(err)
  1019. }
  1020. if err := d.put_kv(Int(4), Int(6)); err != nil {
  1021. t.Error(err)
  1022. }
  1023. e := a.find_end_of_pure_run()
  1024. if e != c {
  1025. t.Errorf("end of run should have been block c %v %v", e, c)
  1026. }
  1027. }
  1028. func Test_insert_linked_list_node(t *testing.T) {
  1029. a := NewLeaf(1)
  1030. insert_linked_list_node(a, nil, nil)
  1031. b := NewLeaf(2)
  1032. insert_linked_list_node(b, a, nil)
  1033. c := NewLeaf(3)
  1034. insert_linked_list_node(c, b, nil)
  1035. d := NewLeaf(4)
  1036. insert_linked_list_node(d, a, b)
  1037. if a.getPrev() != nil {
  1038. t.Errorf("expected a.prev == nil")
  1039. }
  1040. if a.getNext() != d {
  1041. t.Errorf("expected a.next == d")
  1042. }
  1043. if d.getPrev() != a {
  1044. t.Errorf("expected d.prev == a")
  1045. }
  1046. if d.getNext() != b {
  1047. t.Errorf("expected d.next == b")
  1048. }
  1049. if b.getPrev() != d {
  1050. t.Errorf("expected b.prev == d")
  1051. }
  1052. if b.getNext() != c {
  1053. t.Errorf("expected b.next == c")
  1054. }
  1055. if c.getPrev() != b {
  1056. t.Errorf("expected c.prev == b")
  1057. }
  1058. if c.getNext() != nil {
  1059. t.Errorf("expected c.next == nil")
  1060. }
  1061. }
  1062. func Test_remove_linked_list_node(t *testing.T) {
  1063. a := NewLeaf(1)
  1064. insert_linked_list_node(a, nil, nil)
  1065. b := NewLeaf(2)
  1066. insert_linked_list_node(b, a, nil)
  1067. c := NewLeaf(3)
  1068. insert_linked_list_node(c, b, nil)
  1069. d := NewLeaf(4)
  1070. insert_linked_list_node(d, a, b)
  1071. if a.getPrev() != nil {
  1072. t.Errorf("expected a.prev == nil")
  1073. }
  1074. if a.getNext() != d {
  1075. t.Errorf("expected a.next == d")
  1076. }
  1077. if d.getPrev() != a {
  1078. t.Errorf("expected d.prev == a")
  1079. }
  1080. if d.getNext() != b {
  1081. t.Errorf("expected d.next == b")
  1082. }
  1083. if b.getPrev() != d {
  1084. t.Errorf("expected b.prev == d")
  1085. }
  1086. if b.getNext() != c {
  1087. t.Errorf("expected b.next == c")
  1088. }
  1089. if c.getPrev() != b {
  1090. t.Errorf("expected c.prev == b")
  1091. }
  1092. if c.getNext() != nil {
  1093. t.Errorf("expected c.next == nil")
  1094. }
  1095. remove_linked_list_node(d)
  1096. if a.getPrev() != nil {
  1097. t.Errorf("expected a.prev == nil")
  1098. }
  1099. if a.getNext() != b {
  1100. t.Errorf("expected a.next == b")
  1101. }
  1102. if b.getPrev() != a {
  1103. t.Errorf("expected b.prev == a")
  1104. }
  1105. if b.getNext() != c {
  1106. t.Errorf("expected b.next == c")
  1107. }
  1108. if c.getPrev() != b {
  1109. t.Errorf("expected c.prev == b")
  1110. }
  1111. if c.getNext() != nil {
  1112. t.Errorf("expected c.next == nil")
  1113. }
  1114. remove_linked_list_node(a)
  1115. if b.getPrev() != nil {
  1116. t.Errorf("expected b.prev == nil")
  1117. }
  1118. if b.getNext() != c {
  1119. t.Errorf("expected b.next == c")
  1120. }
  1121. if c.getPrev() != b {
  1122. t.Errorf("expected c.prev == b")
  1123. }
  1124. if c.getNext() != nil {
  1125. t.Errorf("expected c.next == nil")
  1126. }
  1127. remove_linked_list_node(c)
  1128. if b.getPrev() != nil {
  1129. t.Errorf("expected b.prev == nil")
  1130. }
  1131. if b.getNext() != nil {
  1132. t.Errorf("expected b.next == nil")
  1133. }
  1134. remove_linked_list_node(b)
  1135. }
  1136. func Test_balance_leaf_nodes_with_dup(t *testing.T) {
  1137. a := NewLeaf(3)
  1138. b := NewLeaf(3)
  1139. if err := a.put_kv(Int(1), Int(1)); err != nil {
  1140. t.Error(err)
  1141. }
  1142. if err := a.put_kv(Int(1), Int(1)); err != nil {
  1143. t.Error(err)
  1144. }
  1145. if err := a.put_kv(Int(2), Int(1)); err != nil {
  1146. t.Error(err)
  1147. }
  1148. balance_nodes(a, b, Int(2))
  1149. if !a.has(Int(1)) || a.has(Int(2)) {
  1150. t.Error("a had wrong items", a)
  1151. }
  1152. if !b.has(Int(2)) || b.has(Int(1)) {
  1153. t.Error("a had wrong items", b)
  1154. }
  1155. }
  1156. func Test_balance_leaf_nodes(t *testing.T) {
  1157. a := NewLeaf(7)
  1158. b := NewLeaf(7)
  1159. if err := a.put_kv(Int(1), Int(1)); err != nil {
  1160. t.Error(err)
  1161. }
  1162. if err := a.put_kv(Int(2), Int(2)); err != nil {
  1163. t.Error(err)
  1164. }
  1165. if err := a.put_kv(Int(3), Int(3)); err != nil {
  1166. t.Error(err)
  1167. }
  1168. if err := a.put_kv(Int(4), Int(4)); err != nil {
  1169. t.Error(err)
  1170. }
  1171. if err := a.put_kv(Int(5), Int(5)); err != nil {
  1172. t.Error(err)
  1173. }
  1174. if err := a.put_kv(Int(6), Int(6)); err != nil {
  1175. t.Error(err)
  1176. }
  1177. if err := a.put_kv(Int(7), Int(7)); err != nil {
  1178. t.Error(err)
  1179. }
  1180. balance_nodes(a, b, Int(5))
  1181. for i, k := range a.keys {
  1182. if int(k.(Int)) != i+1 {
  1183. t.Errorf("k != %d", i+1)
  1184. }
  1185. }
  1186. for i, k := range b.keys {
  1187. if int(k.(Int)) != 5+i {
  1188. t.Errorf("k != %d", 5+i)
  1189. }
  1190. }
  1191. for i, v := range a.values {
  1192. if int(v.(Int)) != i+1 {
  1193. t.Errorf("k != %d", i+1)
  1194. }
  1195. }
  1196. for i, v := range b.values {
  1197. if int(v.(Int)) != 5+i {
  1198. t.Errorf("v != %d", 5+i)
  1199. }
  1200. }
  1201. t.Log(a)
  1202. t.Log(b)
  1203. }
  1204. func Test_balance_internal_nodes(t *testing.T) {
  1205. a := NewInternal(6)
  1206. b := NewInternal(6)
  1207. if err := a.put_kp(Int(1), nil); err != nil {
  1208. t.Error(err)
  1209. }
  1210. if err := a.put_kp(Int(2), nil); err != nil {
  1211. t.Error(err)
  1212. }
  1213. if err := a.put_kp(Int(3), nil); err != nil {
  1214. t.Error(err)
  1215. }
  1216. if err := a.put_kp(Int(4), nil); err != nil {
  1217. t.Error(err)
  1218. }
  1219. if err := a.put_kp(Int(5), nil); err != nil {
  1220. t.Error(err)
  1221. }
  1222. if err := a.put_kp(Int(6), nil); err != nil {
  1223. t.Error(err)
  1224. }
  1225. balance_nodes(a, b, Int(4))
  1226. for i, k := range a.keys {
  1227. if int(k.(Int)) != i+1 {
  1228. t.Errorf("k != %d", i+1)
  1229. }
  1230. }
  1231. for i, k := range b.keys {
  1232. if int(k.(Int)) != 3+i+1 {
  1233. t.Errorf("k != %d", 3+i+1)
  1234. }
  1235. }
  1236. t.Log(a)
  1237. t.Log(b)
  1238. }
  1239. // copied from
  1240. // ThreadSafeRand provides a thread safe version of math/rand.Rand using
  1241. // the same technique used in the math/rand package to make the top level
  1242. // functions thread safe.
  1243. func ThreadSafeRand(seed int64) *mrand.Rand {
  1244. return mrand.New(&lockedSource{src: mrand.NewSource(seed).(mrand.Source64)})
  1245. }
  1246. // from: https://golang.org/src/math/rand/rand.go?s=8161:8175#L317
  1247. type lockedSource struct {
  1248. lk sync.Mutex
  1249. src mrand.Source64
  1250. }
  1251. func (r *lockedSource) Int63() (n int64) {
  1252. r.lk.Lock()
  1253. n = r.src.Int63()
  1254. r.lk.Unlock()
  1255. return
  1256. }
  1257. func (r *lockedSource) Uint64() (n uint64) {
  1258. r.lk.Lock()
  1259. n = r.src.Uint64()
  1260. r.lk.Unlock()
  1261. return
  1262. }
  1263. func (r *lockedSource) Seed(seed int64) {
  1264. r.lk.Lock()
  1265. r.src.Seed(seed)
  1266. r.lk.Unlock()
  1267. }
  1268. // seedPos implements Seed for a lockedSource without a race condiiton.
  1269. func (r *lockedSource) seedPos(seed int64, readPos *int8) {
  1270. r.lk.Lock()
  1271. r.src.Seed(seed)
  1272. *readPos = 0
  1273. r.lk.Unlock()
  1274. }
  1275. // read implements Read for a lockedSource without a race condition.
  1276. func (r *lockedSource) read(p []byte, readVal *int64, readPos *int8) (n int, err error) {
  1277. r.lk.Lock()
  1278. n, err = read(p, r.src.Int63, readVal, readPos)
  1279. r.lk.Unlock()
  1280. return
  1281. }
  1282. func read(p []byte, int63 func() int64, readVal *int64, readPos *int8) (n int, err error) {
  1283. pos := *readPos
  1284. val := *readVal
  1285. for n = 0; n < len(p); n++ {
  1286. if pos == 0 {
  1287. val = int63()
  1288. pos = 7
  1289. }
  1290. p[n] = byte(val)
  1291. val >>= 8
  1292. pos--
  1293. }
  1294. *readPos = pos
  1295. *readVal = val
  1296. return
  1297. }
  1298. // copied from https://sourcegraph.com/github.com/timtadh/data-structures@master/-/blob/test/support.go
  1299. type T testing.T
  1300. func (t *T) Assert(ok bool, msg string, vars ...ItemValue) {
  1301. if !ok {
  1302. t.Log("\n" + string(debug.Stack()))
  1303. var objects []interface{}
  1304. for _, t := range vars {
  1305. objects = append(objects, t)
  1306. }
  1307. t.Fatalf(msg, objects...)
  1308. }
  1309. }
  1310. func (t *T) AssertNil(errors ...error) {
  1311. any := false
  1312. for _, err := range errors {
  1313. if err != nil {
  1314. any = true
  1315. t.Log("\n" + string(debug.Stack()))
  1316. t.Error(err)
  1317. }
  1318. }
  1319. if any {
  1320. t.Fatal("assert failed")
  1321. }
  1322. }
  1323. func RandSlice(length int) []byte {
  1324. slice := make([]byte, length)
  1325. if _, err := crand.Read(slice); err != nil {
  1326. panic(err)
  1327. }
  1328. return slice
  1329. }
  1330. func RandHex(length int) string {
  1331. return hex.EncodeToString(RandSlice(length / 2))
  1332. }
  1333. func RandStr(length int) string {
  1334. return string(RandSlice(length))
  1335. }