module models fn test_circle_dumps_loads() { // Create a test circle with some sample data mut circle := Circle{ id: 123 name: 'Test Circle' description: 'A test circle for binary encoding' } // Add a member mut member1 := Member{ pubkeys: ['user1-pubkey'] name: 'User One' description: 'First test user' role: .admin emails: ['user1@example.com', 'user.one@example.org'] } circle.members << member1 // Add another member mut member2 := Member{ pubkeys: ['user2-pubkey'] name: 'User Two' description: 'Second test user' role: .member emails: ['user2@example.com'] } circle.members << member2 // Test binary encoding binary_data := circle.dumps() or { assert false, 'Failed to encode circle: ${err}' return } // Test binary decoding decoded_circle := circle_loads(binary_data) or { assert false, 'Failed to decode circle: ${err}' return } // Verify the decoded data matches the original assert decoded_circle.id == circle.id assert decoded_circle.name == circle.name assert decoded_circle.description == circle.description // Verify members assert decoded_circle.members.len == circle.members.len // Verify first member assert decoded_circle.members[0].pubkeys.len == circle.members[0].pubkeys.len assert decoded_circle.members[0].pubkeys[0] == circle.members[0].pubkeys[0] assert decoded_circle.members[0].name == circle.members[0].name assert decoded_circle.members[0].description == circle.members[0].description assert decoded_circle.members[0].role == circle.members[0].role assert decoded_circle.members[0].emails.len == circle.members[0].emails.len assert decoded_circle.members[0].emails[0] == circle.members[0].emails[0] assert decoded_circle.members[0].emails[1] == circle.members[0].emails[1] // Verify second member assert decoded_circle.members[1].pubkeys.len == circle.members[1].pubkeys.len assert decoded_circle.members[1].pubkeys[0] == circle.members[1].pubkeys[0] assert decoded_circle.members[1].name == circle.members[1].name assert decoded_circle.members[1].description == circle.members[1].description assert decoded_circle.members[1].role == circle.members[1].role assert decoded_circle.members[1].emails.len == circle.members[1].emails.len assert decoded_circle.members[1].emails[0] == circle.members[1].emails[0] println('Circle binary encoding/decoding test passed successfully') } fn test_circle_complex_structure() { // Create a more complex circle with multiple members of different roles mut circle := Circle{ id: 456 name: 'Complex Test Circle' description: 'A complex test circle with multiple members' } // Add admin member circle.members << Member{ pubkeys: ['admin-pubkey'] name: 'Admin User' description: 'Circle administrator' role: .admin emails: ['admin@example.com'] } // Add stakeholder member circle.members << Member{ pubkeys: ['stakeholder-pubkey'] name: 'Stakeholder User' description: 'Circle stakeholder' role: .stakeholder emails: ['stakeholder@example.com', 'stakeholder@company.com'] } // Add regular members circle.members << Member{ pubkeys: ['member1-pubkey'] name: 'Regular Member 1' description: 'First regular member' role: .member emails: ['member1@example.com'] } circle.members << Member{ pubkeys: ['member2-pubkey'] name: 'Regular Member 2' description: 'Second regular member' role: .member emails: ['member2@example.com'] } // Add contributor circle.members << Member{ pubkeys: ['contributor-pubkey'] name: 'Contributor' description: 'Circle contributor' role: .contributor emails: ['contributor@example.com'] } // Add guest circle.members << Member{ pubkeys: ['guest-pubkey'] name: 'Guest User' description: 'Circle guest' role: .guest emails: ['guest@example.com'] } // Test binary encoding binary_data := circle.dumps() or { assert false, 'Failed to encode complex circle: ${err}' return } // Test binary decoding decoded_circle := circle_loads(binary_data) or { assert false, 'Failed to decode complex circle: ${err}' return } // Verify the decoded data matches the original assert decoded_circle.id == circle.id assert decoded_circle.name == circle.name assert decoded_circle.description == circle.description assert decoded_circle.members.len == circle.members.len // Verify each member type is correctly encoded/decoded mut role_counts := { Role.admin: 0 Role.stakeholder: 0 Role.member: 0 Role.contributor: 0 Role.guest: 0 } for member in decoded_circle.members { role_counts[member.role]++ } assert role_counts[Role.admin] == 1 assert role_counts[Role.stakeholder] == 1 assert role_counts[Role.member] == 2 assert role_counts[Role.contributor] == 1 assert role_counts[Role.guest] == 1 // Verify specific members by pubkeys for i, member in circle.members { decoded_member := decoded_circle.members[i] assert decoded_member.pubkeys.len == member.pubkeys.len assert decoded_member.pubkeys[0] == member.pubkeys[0] assert decoded_member.name == member.name assert decoded_member.description == member.description assert decoded_member.role == member.role assert decoded_member.emails.len == member.emails.len for j, email in member.emails { assert decoded_member.emails[j] == email } } println('Complex circle binary encoding/decoding test passed successfully') } fn test_circle_empty_members() { // Test a circle with no members circle := Circle{ id: 789 name: 'Empty Circle' description: 'A circle with no members' members: [] } // Test binary encoding binary_data := circle.dumps() or { assert false, 'Failed to encode empty circle: ${err}' return } // Test binary decoding decoded_circle := circle_loads(binary_data) or { assert false, 'Failed to decode empty circle: ${err}' return } // Verify the decoded data matches the original assert decoded_circle.id == circle.id assert decoded_circle.name == circle.name assert decoded_circle.description == circle.description assert decoded_circle.members.len == 0 println('Empty circle binary encoding/decoding test passed successfully') }