@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
284 lines (251 loc) • 7.94 kB
text/typescript
import { addressSplit, formatAddress } from "../addressUtils";
describe("formatAddress", () => {
it("should format long addresses with ellipsis (default 4+4)", () => {
expect(formatAddress("0x1234567890abcdef")).toBe("0x12...cdef");
});
it("should return short addresses as-is when below threshold", () => {
expect(formatAddress("0x123")).toBe("0x123");
});
it("should support custom prefix/suffix length", () => {
expect(formatAddress("0x1234567890abcdef", { prefixLength: 5, suffixLength: 5 })).toBe(
"0x123...bcdef",
);
});
it("should support different prefix and suffix lengths", () => {
expect(formatAddress("0x1234567890abcdef", { prefixLength: 5, suffixLength: 4 })).toBe(
"0x123...cdef",
);
});
it("should handle empty string", () => {
expect(formatAddress("")).toBe("");
});
it("should support custom separator", () => {
expect(formatAddress("0x1234567890abcdef", { separator: "…" })).toBe("0x12…cdef");
});
it("should respect threshold option", () => {
expect(formatAddress("123456789", { threshold: 10 })).toBe("123456789");
});
it("should support prefixLength 0", () => {
expect(
formatAddress("1234567890abcdef", {
prefixLength: 0,
suffixLength: 10,
separator: "---",
}),
).toBe("---7890abcdef");
});
it("should support empty separator", () => {
expect(
formatAddress("1234567890abcdef1234567890abcdef", {
prefixLength: 5,
suffixLength: 5,
separator: "",
}),
).toBe("12345bcdef");
});
});
describe("addressSplit", () => {
describe("Basic functionality", () => {
it("should split a simple address correctly", () => {
const result = addressSplit("HelloWorld", 2);
expect(result).toEqual({
start: "He",
middle: "lloWor",
end: "ld",
});
});
it("should split a longer address with size 4", () => {
const result = addressSplit("0x1234567890abcdef", 4);
expect(result).toEqual({
start: "0x12",
middle: "34567890ab",
end: "cdef",
});
});
});
describe("Boundary conditions", () => {
it("should handle exact boundary where size * 2 equals address length", () => {
const result = addressSplit("ABCDEF", 3);
expect(result).toEqual({
start: "ABC",
middle: "",
end: "DEF",
});
});
it("should handle size equal to half address length", () => {
const result = addressSplit("ABCDEFGH", 4);
expect(result).toEqual({
start: "ABCD",
middle: "",
end: "EFGH",
});
});
it("should handle odd-length address with equal split", () => {
const result = addressSplit("ABCDE", 2);
expect(result).toEqual({
start: "AB",
middle: "C",
end: "DE",
});
});
it("should handle very long address", () => {
const longAddress = "A".repeat(1000);
const result = addressSplit(longAddress, 10);
expect(result).toEqual({
start: "A".repeat(10),
middle: "A".repeat(980),
end: "A".repeat(10),
});
expect(result.start.length + result.middle.length + result.end.length).toBe(1000);
});
});
describe("Edge cases - size variations", () => {
it("should handle size of 0", () => {
const result = addressSplit("HelloWorld", 0);
expect(result).toEqual({
start: "",
middle: "HelloWorld",
end: "",
});
});
it("should handle size of 1", () => {
const result = addressSplit("HelloWorld", 1);
expect(result).toEqual({
start: "H",
middle: "elloWorl",
end: "d",
});
});
it("should handle negative size", () => {
const result = addressSplit("HelloWorld", -5);
expect(result).toEqual({
start: "",
middle: "HelloWorld",
end: "",
});
});
it("should handle size larger than half the address length", () => {
const result = addressSplit("Hello", 3);
expect(result).toEqual({
start: "He",
middle: "",
end: "llo",
});
});
it("should handle size equal to address length", () => {
const result = addressSplit("Hello", 5);
expect(result).toEqual({
start: "He",
middle: "",
end: "llo",
});
});
it("should handle size larger than address length", () => {
const result = addressSplit("Hello", 10);
expect(result).toEqual({
start: "He",
middle: "",
end: "llo",
});
});
});
describe("Edge cases - address variations", () => {
it("should handle empty string", () => {
const result = addressSplit("", 2);
expect(result).toEqual({
start: "",
middle: "",
end: "",
});
});
it("should handle single character address", () => {
const result = addressSplit("A", 1);
expect(result).toEqual({
start: "",
middle: "",
end: "A",
});
});
it("should handle two character address", () => {
const result = addressSplit("AB", 1);
expect(result).toEqual({
start: "A",
middle: "",
end: "B",
});
});
it("should handle three character address with size 1", () => {
const result = addressSplit("ABC", 1);
expect(result).toEqual({
start: "A",
middle: "B",
end: "C",
});
});
});
describe("Real-world cryptocurrency addresses", () => {
it("should split a Bitcoin address correctly", () => {
const bitcoinAddress = "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa";
const result = addressSplit(bitcoinAddress, 5);
expect(result).toEqual({
start: "1A1zP",
middle: "1eP5QGefi2DMPTfTL5SLmv7D",
end: "ivfNa",
});
});
it("should split an Ethereum address correctly", () => {
const ethAddress = "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb";
const result = addressSplit(ethAddress, 6);
expect(result).toEqual({
start: "0x742d",
middle: "35Cc6634C0532925a3b844Bc9e759",
end: "5f0bEb",
});
});
it("should handle a Solana address", () => {
const solanaAddress = "7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK";
const result = addressSplit(solanaAddress, 4);
expect(result).toEqual({
start: "7EqQ",
middle: "dEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcM",
end: "wJeK",
});
});
it("should handle a Polkadot address", () => {
const polkadotAddress = "15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5";
const result = addressSplit(polkadotAddress, 6);
expect(result).toEqual({
start: "15oF4u",
middle: "VJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMN",
end: "Hr6Sp5",
});
});
it("should handle a Cardano address", () => {
const cardanoAddress =
"addr1qxy3w7depgr3wle7kqwzz8u4h5f6gxqe9q0rk8w3n0d7wqxqk0n7n8s3w3w3w3w3w3w3w3w3w3w3w3w3w3w";
const result = addressSplit(cardanoAddress, 8);
expect(result).toEqual({
start: "addr1qxy",
middle: "3w7depgr3wle7kqwzz8u4h5f6gxqe9q0rk8w3n0d7wqxqk0n7n8s3w3w3w3w3w3w3w3w3w3w",
end: "3w3w3w3w",
});
});
it("should handle a Near protocol address", () => {
const nearAddress = "alice.near";
const result = addressSplit(nearAddress, 3);
expect(result).toEqual({
start: "ali",
middle: "ce.n",
end: "ear",
});
});
});
describe("Data integrity", () => {
it("should preserve the entire address when concatenated", () => {
const address = "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa";
const result = addressSplit(address, 5);
const reconstructed = result.start + result.middle + result.end;
expect(reconstructed).toBe(address);
});
});
});