| ... | ... | @@ -108,7 +108,7 @@ pub const Node = struct { |
| 108 | 108 | .label = to_label, |
| 109 | 109 | }); |
| 110 | 110 | |
| 111 | | return if (match == label.len) to_node else mid.put(allocator, label[match..]); |
| 111 | return if (match == label.len) mid else mid.put(allocator, label[match..]); |
| 112 | 112 | } |
| 113 | 113 | |
| 114 | 114 | // Add a new node. |
| ... | ... | @@ -489,6 +489,21 @@ test "Trie basic" { |
| 489 | 489 | } |
| 490 | 490 | } |
| 491 | 491 | |
| 492 | fn expectEqualHexStrings(expected: []const u8, given: []const u8) !void { |
| 493 | assert(expected.len > 0); |
| 494 | if (mem.eql(u8, expected, given)) return; |
| 495 | const expected_fmt = try std.fmt.allocPrint(testing.allocator, "{x}", .{std.fmt.fmtSliceHexLower(expected)}); |
| 496 | defer testing.allocator.free(expected_fmt); |
| 497 | const given_fmt = try std.fmt.allocPrint(testing.allocator, "{x}", .{std.fmt.fmtSliceHexLower(given)}); |
| 498 | defer testing.allocator.free(given_fmt); |
| 499 | const idx = mem.indexOfDiff(u8, expected_fmt, given_fmt).?; |
| 500 | var padding = try testing.allocator.alloc(u8, idx + 5); |
| 501 | defer testing.allocator.free(padding); |
| 502 | mem.set(u8, padding, ' '); |
| 503 | std.debug.print("\nEXP: {s}\nGIV: {s}\n{s}^ -- first differing byte\n", .{ expected_fmt, given_fmt, padding }); |
| 504 | return error.TestFailed; |
| 505 | } |
| 506 | |
| 492 | 507 | test "write Trie to a byte stream" { |
| 493 | 508 | var gpa = testing.allocator; |
| 494 | 509 | var trie: Trie = .{}; |
| ... | ... | @@ -523,16 +538,14 @@ test "write Trie to a byte stream" { |
| 523 | 538 | defer gpa.free(buffer); |
| 524 | 539 | var stream = std.io.fixedBufferStream(buffer); |
| 525 | 540 | { |
| 526 | | const nwritten = try trie.write(stream.writer()); |
| 527 | | try testing.expect(nwritten == trie.size); |
| 528 | | try testing.expect(mem.eql(u8, buffer, &exp_buffer)); |
| 541 | _ = try trie.write(stream.writer()); |
| 542 | try expectEqualHexStrings(&exp_buffer, buffer); |
| 529 | 543 | } |
| 530 | 544 | { |
| 531 | 545 | // Writing finalized trie again should yield the same result. |
| 532 | 546 | try stream.seekTo(0); |
| 533 | | const nwritten = try trie.write(stream.writer()); |
| 534 | | try testing.expect(nwritten == trie.size); |
| 535 | | try testing.expect(mem.eql(u8, buffer, &exp_buffer)); |
| 547 | _ = try trie.write(stream.writer()); |
| 548 | try expectEqualHexStrings(&exp_buffer, buffer); |
| 536 | 549 | } |
| 537 | 550 | } |
| 538 | 551 | |
| ... | ... | @@ -562,8 +575,37 @@ test "parse Trie from byte stream" { |
| 562 | 575 | var out_buffer = try gpa.alloc(u8, trie.size); |
| 563 | 576 | defer gpa.free(out_buffer); |
| 564 | 577 | var out_stream = std.io.fixedBufferStream(out_buffer); |
| 565 | | const nwritten = try trie.write(out_stream.writer()); |
| 578 | _ = try trie.write(out_stream.writer()); |
| 579 | try expectEqualHexStrings(&in_buffer, out_buffer); |
| 580 | } |
| 566 | 581 | |
| 567 | | try testing.expect(nwritten == trie.size); |
| 568 | | try testing.expect(mem.eql(u8, &in_buffer, out_buffer)); |
| 582 | test "ordering bug" { |
| 583 | var gpa = testing.allocator; |
| 584 | var trie: Trie = .{}; |
| 585 | defer trie.deinit(gpa); |
| 586 | |
| 587 | try trie.put(gpa, .{ |
| 588 | .name = "_asStr", |
| 589 | .vmaddr_offset = 0x558, |
| 590 | .export_flags = 0, |
| 591 | }); |
| 592 | try trie.put(gpa, .{ |
| 593 | .name = "_a", |
| 594 | .vmaddr_offset = 0x8008, |
| 595 | .export_flags = 0, |
| 596 | }); |
| 597 | try trie.finalize(gpa); |
| 598 | |
| 599 | const exp_buffer = [_]u8{ |
| 600 | 0x00, 0x01, 0x5F, 0x61, 0x00, 0x06, 0x04, 0x00, |
| 601 | 0x88, 0x80, 0x02, 0x01, 0x73, 0x53, 0x74, 0x72, |
| 602 | 0x00, 0x12, 0x03, 0x00, 0xD8, 0x0A, 0x00, |
| 603 | }; |
| 604 | |
| 605 | var buffer = try gpa.alloc(u8, trie.size); |
| 606 | defer gpa.free(buffer); |
| 607 | var stream = std.io.fixedBufferStream(buffer); |
| 608 | // Writing finalized trie again should yield the same result. |
| 609 | _ = try trie.write(stream.writer()); |
| 610 | try expectEqualHexStrings(&exp_buffer, buffer); |
| 569 | 611 | } |