diff --git a/packages/neuron-ui/src/components/Send/hooks.ts b/packages/neuron-ui/src/components/Send/hooks.ts index 6bcb392f5a..6eb2bafcb5 100644 --- a/packages/neuron-ui/src/components/Send/hooks.ts +++ b/packages/neuron-ui/src/components/Send/hooks.ts @@ -3,7 +3,7 @@ import React, { useState, useCallback, useEffect, useMemo } from 'react' import { AppActions, StateDispatch } from 'states/stateProvider/reducer' import { calculateCycles } from 'services/remote/wallets' -import { outputsToTotalCapacity, priceToFee } from 'utils/formatters' +import { outputsToTotalAmount, priceToFee } from 'utils/formatters' import { verifyAddress, verifyAmount, verifyAmountRange, verifyTransactionOutputs } from 'utils/validators' import { ErrorCode } from 'utils/const' import { MAX_DECIMAL_DIGITS } from '../../utils/const' @@ -58,7 +58,7 @@ const useOnTransactionChange = ( cyclesTimer = setTimeout(() => { if (verifyTransactionOutputs(items)) { setIsTransactionValid(true) - const totalAmount = outputsToTotalCapacity(items) + const totalAmount = outputsToTotalAmount(items) setTotalAmount(totalAmount) calculateCycles({ walletID, diff --git a/packages/neuron-ui/src/tests/formatters/CKBToShannonFormatter/fixtures.ts b/packages/neuron-ui/src/tests/formatters/CKBToShannonFormatter/fixtures.ts new file mode 100644 index 0000000000..76d9fd68c3 --- /dev/null +++ b/packages/neuron-ui/src/tests/formatters/CKBToShannonFormatter/fixtures.ts @@ -0,0 +1,69 @@ +import { CapacityUnit } from 'utils/const' + +const fixtures = [ + { + ckb: { + amount: `1.234`, + unit: CapacityUnit.CKB, + }, + expected: `123400000`, + }, + { + ckb: { + amount: `1.23456789`, + unit: CapacityUnit.CKB, + }, + expected: `123456789`, + }, + { + ckb: { + amount: `1.0`, + unit: CapacityUnit.CKB, + }, + expected: `100000000`, + }, + { + ckb: { + amount: `1.`, + unit: CapacityUnit.CKB, + }, + expected: `100000000`, + }, + { + ckb: { + amount: `0.123`, + unit: CapacityUnit.CKB, + }, + expected: `12300000`, + }, + { + ckb: { + amount: `.123`, + unit: CapacityUnit.CKB, + }, + expected: `12300000`, + }, + { + ckb: { + amount: `12345678901234567890123456789012345678901234567890123456789012345678901234`, + unit: CapacityUnit.CKB, + }, + expected: `1234567890123456789012345678901234567890123456789012345678901234567890123400000000`, + }, + { + ckb: { + amount: `12345678901234567890123456789012345678901234567890123456789012345678901234`, + unit: CapacityUnit.CKKB, + }, + expected: `1234567890123456789012345678901234567890123456789012345678901234567890123400000000000`, + }, + { + ckb: { + amount: `12345678901234567890123456789012345678901234567890123456789012345678901234`, + unit: CapacityUnit.CKGB, + }, + expected: `1234567890123456789012345678901234567890123456789012345678901234567890123400000000000000000`, + }, +] + +export default fixtures diff --git a/packages/neuron-ui/src/tests/formatters/CKBToShannonFormatter/index.test.ts b/packages/neuron-ui/src/tests/formatters/CKBToShannonFormatter/index.test.ts new file mode 100644 index 0000000000..0e5565f06f --- /dev/null +++ b/packages/neuron-ui/src/tests/formatters/CKBToShannonFormatter/index.test.ts @@ -0,0 +1,11 @@ +import { CapacityUnit } from 'utils/const' +import { CKBToShannonFormatter } from 'utils/formatters' +import fixtures from './fixtures' + +const fixtureTable = fixtures.map(({ ckb: { amount, unit }, expected }) => [amount, unit, expected]) + +describe(`Verify CKB to Shannons formatter`, () => { + test.each(fixtureTable)(`%s %s => %s shannons`, (amount: string, unit: CapacityUnit, expected: string) => { + expect(CKBToShannonFormatter(amount, unit)).toBe(expected) + }) +}) diff --git a/packages/neuron-ui/src/tests/formatters/addressesToBalance/fixtures.ts b/packages/neuron-ui/src/tests/formatters/addressesToBalance/fixtures.ts new file mode 100644 index 0000000000..8e9ef9b4e9 --- /dev/null +++ b/packages/neuron-ui/src/tests/formatters/addressesToBalance/fixtures.ts @@ -0,0 +1,79 @@ +const fixtures: { + [title: string]: { + addresses: { + balance: string | undefined + }[] + expected: string + } +} = { + basic: { + addresses: [ + { + balance: '100', + }, + { + balance: '10000', + }, + { + balance: '200', + }, + { + balance: '10000', + }, + ], + expected: '20300', + }, + 'number large than MAX SAFE INTEGER': { + addresses: [ + { + balance: '100', + }, + { + balance: '10000', + }, + { + balance: '200', + }, + { + balance: '100000000000000000000000000000000000000000000000000000000000', + }, + ], + expected: '100000000000000000000000000000000000000000000000000000010300', + }, + 'address has negative balance': { + addresses: [ + { + balance: '-100', + }, + { + balance: '10000', + }, + { + balance: '200', + }, + { + balance: '100000000000000000000000000000000000000000000000000000000000', + }, + ], + expected: '100000000000000000000000000000000000000000000000000000010100', + }, + 'address has undefined balance': { + addresses: [ + { + balance: undefined, + }, + { + balance: '10000', + }, + { + balance: '200', + }, + { + balance: '100000000000000000000000000000000000000000000000000000000000', + }, + ], + expected: '100000000000000000000000000000000000000000000000000000010200', + }, +} + +export default fixtures diff --git a/packages/neuron-ui/src/tests/formatters/addressesToBalance/index.test.ts b/packages/neuron-ui/src/tests/formatters/addressesToBalance/index.test.ts new file mode 100644 index 0000000000..57ee59d3a2 --- /dev/null +++ b/packages/neuron-ui/src/tests/formatters/addressesToBalance/index.test.ts @@ -0,0 +1,10 @@ +import { addressesToBalance } from 'utils/formatters' +import fixtures from './fixtures' + +const fixtureTable = Object.entries(fixtures).map(([title, { addresses, expected }]) => [title, addresses, expected]) + +describe(`Verify addresses to balance`, () => { + test.each(fixtureTable)(`%s`, (_title: string, addresses: any, expected: string) => { + expect(addressesToBalance(addresses)).toBe(expected) + }) +}) diff --git a/packages/neuron-ui/src/tests/formatters/currencyFormatter/fixtures.ts b/packages/neuron-ui/src/tests/formatters/currencyFormatter/fixtures.ts new file mode 100644 index 0000000000..c90cb8f371 --- /dev/null +++ b/packages/neuron-ui/src/tests/formatters/currencyFormatter/fixtures.ts @@ -0,0 +1,43 @@ +const fixtures = [ + { + value: { + shannons: `1234567890`, + unit: `CKB`, + exchange: `0.000000001`, + }, + expected: `1.23456789 CKB`, + }, + { + value: { + shannons: `1234567890`, + unit: `CKB`, + exchange: `0.00065`, + }, + expected: `802,469.1285 CKB`, + }, + { + value: { + shannons: `1234567890`, + unit: `CNY`, + exchange: `0.00065`, + }, + expected: `802,469.1285 CNY`, + }, + { + value: { + shannons: `1234567890123456789012345678901234567890123456789012345678901234567890`, + unit: `CNY`, + exchange: `0.65`, + }, + expected: `802,469,128,580,246,912,858,024,691,285,802,469,128,580,246,912,858,024,691,285,802,469,128.5 CNY`, + }, + { + value: { + shannons: `12345678901234567890123456789012345678901234567890123456789012345678901234`, + unit: `CNY`, + exchange: `0.65`, + }, + expected: `8,024,691,285,802,469,128,580,246,912,858,024,691,285,802,469,128,580,246,912,858,024,691,285,802.1 CNY`, + }, +] +export default fixtures diff --git a/packages/neuron-ui/src/tests/formatters/currencyFormatter/index.test.ts b/packages/neuron-ui/src/tests/formatters/currencyFormatter/index.test.ts new file mode 100644 index 0000000000..a8e804ef62 --- /dev/null +++ b/packages/neuron-ui/src/tests/formatters/currencyFormatter/index.test.ts @@ -0,0 +1,10 @@ +import { currencyFormatter } from 'utils/formatters' +import fixtures from './fixtures' + +const fixtureTable = fixtures.map(({ value, expected }) => [value, expected]) + +describe(`Verify currency formatter`, () => { + test.each(fixtureTable)(`%j => %s`, (value: any, expected: string) => { + expect(currencyFormatter(value.shannons, value.unit, value.exchange)).toBe(expected) + }) +}) diff --git a/packages/neuron-ui/src/tests/formatters/formatters.test.ts b/packages/neuron-ui/src/tests/formatters/formatters.test.ts deleted file mode 100644 index 17bcde6644..0000000000 --- a/packages/neuron-ui/src/tests/formatters/formatters.test.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { CapacityUnit } from 'utils/const' -import { - currencyFormatter, - currencyCode, - CKBToShannonFormatter, - shannonToCKBFormatter, - addressesToBalance, - outputsToTotalCapacity, -} from 'utils/formatters' - -describe(`formatters`, () => { - it(`currencyFormatter`, () => { - const fixtures = [ - { - source: { - shannons: `1234567890`, - unit: `CKB` as currencyCode, - exchange: `0.000000001`, - }, - target: `1.23456789 CKB`, - }, - { - source: { - shannons: `1234567890`, - unit: `CKB` as currencyCode, - exchange: `0.00065`, - }, - target: `802,469.1285 CKB`, - }, - { - source: { - shannons: `1234567890`, - unit: `CNY` as currencyCode, - exchange: `0.00065`, - }, - target: `802,469.1285 CNY`, - }, - { - source: { - shannons: `1234567890123456789012345678901234567890123456789012345678901234567890`, - unit: `CNY` as currencyCode, - exchange: `0.65`, - }, - target: `802,469,128,580,246,912,858,024,691,285,802,469,128,580,246,912,858,024,691,285,802,469,128.5 CNY`, - }, - { - source: { - shannons: `12345678901234567890123456789012345678901234567890123456789012345678901234`, - unit: `CNY` as currencyCode, - exchange: `0.65`, - }, - target: `8,024,691,285,802,469,128,580,246,912,858,024,691,285,802,469,128,580,246,912,858,024,691,285,802.1 CNY`, - }, - ] - fixtures.forEach(fixture => { - const result = currencyFormatter(fixture.source.shannons, fixture.source.unit, fixture.source.exchange) - expect(result).toBe(fixture.target) - }) - }) - - describe(`CKB Formatter`, () => { - it(`CKB to Shannon`, () => { - const fixtures = [ - { - source: { - amount: `1.234`, - uint: CapacityUnit.CKB, - }, - target: `123400000`, - }, - { - source: { - amount: `1.23456789`, - uint: CapacityUnit.CKB, - }, - target: `123456789`, - }, - { - source: { - amount: `1.0`, - uint: CapacityUnit.CKB, - }, - target: `100000000`, - }, - { - source: { - amount: `1.`, - uint: CapacityUnit.CKB, - }, - target: `100000000`, - }, - { - source: { - amount: `0.123`, - uint: CapacityUnit.CKB, - }, - target: `12300000`, - }, - { - source: { - amount: `.123`, - uint: CapacityUnit.CKB, - }, - target: `12300000`, - }, - { - source: { - amount: `12345678901234567890123456789012345678901234567890123456789012345678901234`, - uint: CapacityUnit.CKB, - }, - target: `1234567890123456789012345678901234567890123456789012345678901234567890123400000000`, - }, - { - source: { - amount: `12345678901234567890123456789012345678901234567890123456789012345678901234`, - uint: CapacityUnit.CKKB, - }, - target: `1234567890123456789012345678901234567890123456789012345678901234567890123400000000000`, - }, - { - source: { - amount: `12345678901234567890123456789012345678901234567890123456789012345678901234`, - uint: CapacityUnit.CKGB, - }, - target: `1234567890123456789012345678901234567890123456789012345678901234567890123400000000000000000`, - }, - ] - - fixtures.forEach(fixture => { - expect(CKBToShannonFormatter(fixture.source.amount, fixture.source.uint)).toBe(fixture.target) - }) - }) - - it(`shannon to CKB`, () => { - const fixtures = [ - { - source: `123`, - target: `0.00000123`, - }, - { - source: `12300000`, - target: `0.123`, - }, - { - source: `123000000`, - target: `1.23`, - }, - { - source: `000123000000`, - target: `1.23`, - }, - { - source: `1234567890123456789012345678901234567890123456789012345678901234567890123400000000`, - target: `12,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,901,234`, - }, - { - source: `12345678901234567890123456789012345678901234567890123456789012345678901234`, - target: `123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456.78901234`, - }, - { - source: `1234567890123456789012345678901234567890123456789012345678901234567890123400`, - target: `12,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678.901234`, - }, - - { - source: `-123`, - target: `-0.00000123`, - }, - { - source: `-12300000`, - target: `-0.123`, - }, - { - source: `-123000000`, - target: `-1.23`, - }, - { - source: `-000123000000`, - target: `-1.23`, - }, - { - source: `-1234567890123456789012345678901234567890123456789012345678901234567890123400000000`, - target: `-12,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,901,234`, - }, - { - source: `-12345678901234567890123456789012345678901234567890123456789012345678901234`, - target: `-123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456.78901234`, - }, - { - source: `-1234567890123456789012345678901234567890123456789012345678901234567890123400`, - target: `-12,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678.901234`, - }, - { - source: `0`, - target: `0`, - }, - { - source: `-0`, - target: `0`, - }, - { - source: ``, - target: `0`, - }, - ] - - fixtures.forEach(fixture => { - expect(shannonToCKBFormatter(fixture.source)).toBe(fixture.target) - expect(shannonToCKBFormatter(fixture.source, true)).toBe( - +fixture.source > 0 ? `+${fixture.target}` : fixture.target - ) - }) - }) - - it('addresses to balance', () => { - const fixture = [ - { - address: 'ckt1q9gry5zg8stq8ruq5wfz3lm5wn2k7qw3ulsfmdhe98f2j1', - identifier: '4040ba0ed8a361c59c30bb92f46128f95eaa9bcb', - description: 'description', - type: 0 as 0 | 1, - txCount: 0, - balance: '100', - index: 0, - }, - { - address: 'ckt1q9gry5zg8stq8ruq5wfz3lm5wn2k7qw3ulsfmdhe98f2j3', - identifier: '4040ba0ed8a361c59c30bb92f46128f95eaa9bcb', - description: 'description', - type: 0 as 0 | 1, - txCount: 123, - balance: '10000', - index: 1, - }, - { - address: 'ckt1q9gry5zg8stq8ruq5wfz3lm5wn2k7qw3ulsfmdhe98f2j2', - identifier: '4040ba0ed8a361c59c30bb92f46128f95eaa9bcd', - description: 'description', - type: 1 as 0 | 1, - txCount: 0, - balance: '200', - index: 2, - }, - { - address: 'ckt1q9gry5zg8stq8ruq5wfz3lm5wn2k7qw3ulsfmdhe98f2jd', - identifier: '4040ba0ed8a361c59c30bb92f46128f95eaa9bcd', - description: 'description', - type: 1 as 0 | 1, - txCount: 123, - balance: '10000', - index: 3, - }, - ] - expect(addressesToBalance(fixture)).toBe('20300') - }) - - it('outputsToTotalCapacity', () => { - const fixture: any = [ - { - amount: '100', - unit: 'CKB', - }, - { - amount: '10000', - unit: 'CKB', - }, - { - amount: '200', - unit: 'CKB', - }, - { - amount: '10000', - unit: 'CKB', - }, - ] - expect(outputsToTotalCapacity(fixture)).toBe('20300') - }) - }) -}) diff --git a/packages/neuron-ui/src/tests/formatters/outputsToTotalAmount/fixtures.ts b/packages/neuron-ui/src/tests/formatters/outputsToTotalAmount/fixtures.ts new file mode 100644 index 0000000000..efff213700 --- /dev/null +++ b/packages/neuron-ui/src/tests/formatters/outputsToTotalAmount/fixtures.ts @@ -0,0 +1,53 @@ +const fixtures: { + [title: string]: { + outputs: { + amount: string + unit: 'CKB' + }[] + expected: string + } +} = { + basic: { + outputs: [ + { + amount: '100', + unit: 'CKB', + }, + { + amount: '10000', + unit: 'CKB', + }, + { + amount: '200', + unit: 'CKB', + }, + { + amount: '10000', + unit: 'CKB', + }, + ], + expected: '20300', + }, + 'amount large than MAX SAFE INTEGER': { + outputs: [ + { + amount: '100', + unit: 'CKB', + }, + { + amount: '10000', + unit: 'CKB', + }, + { + amount: '200', + unit: 'CKB', + }, + { + amount: '10000000000000000000000000000000000000000000000000000000000000000000', + unit: 'CKB', + }, + ], + expected: '10000000000000000000000000000000000000000000000000000000000000010300', + }, +} +export default fixtures diff --git a/packages/neuron-ui/src/tests/formatters/outputsToTotalAmount/index.test.ts b/packages/neuron-ui/src/tests/formatters/outputsToTotalAmount/index.test.ts new file mode 100644 index 0000000000..6360373170 --- /dev/null +++ b/packages/neuron-ui/src/tests/formatters/outputsToTotalAmount/index.test.ts @@ -0,0 +1,10 @@ +import { outputsToTotalAmount } from 'utils/formatters' +import fixtures from './fixtures' + +const fixtureTable = Object.entries(fixtures).map(([title, { outputs, expected }]) => [title, outputs, expected]) + +describe(`Verify outputs to total amount`, () => { + test.each(fixtureTable)(`%s`, (_title: string, outputs: any, expected: string) => { + expect(outputsToTotalAmount(outputs)).toBe(expected) + }) +}) diff --git a/packages/neuron-ui/src/tests/formatters/shannonToCKBFormatter/fixtures.ts b/packages/neuron-ui/src/tests/formatters/shannonToCKBFormatter/fixtures.ts new file mode 100644 index 0000000000..bf693cf5f3 --- /dev/null +++ b/packages/neuron-ui/src/tests/formatters/shannonToCKBFormatter/fixtures.ts @@ -0,0 +1,72 @@ +const fixtures = [ + { + shannons: `123`, + expected: `0.00000123`, + }, + { + shannons: `12300000`, + expected: `0.123`, + }, + { + shannons: `123000000`, + expected: `1.23`, + }, + { + shannons: `000123000000`, + expected: `1.23`, + }, + { + shannons: `1234567890123456789012345678901234567890123456789012345678901234567890123400000000`, + expected: `12,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,901,234`, + }, + { + shannons: `12345678901234567890123456789012345678901234567890123456789012345678901234`, + expected: `123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456.78901234`, + }, + { + shannons: `1234567890123456789012345678901234567890123456789012345678901234567890123400`, + expected: `12,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678.901234`, + }, + + { + shannons: `-123`, + expected: `-0.00000123`, + }, + { + shannons: `-12300000`, + expected: `-0.123`, + }, + { + shannons: `-123000000`, + expected: `-1.23`, + }, + { + shannons: `-000123000000`, + expected: `-1.23`, + }, + { + shannons: `-1234567890123456789012345678901234567890123456789012345678901234567890123400000000`, + expected: `-12,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,901,234`, + }, + { + shannons: `-12345678901234567890123456789012345678901234567890123456789012345678901234`, + expected: `-123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456.78901234`, + }, + { + shannons: `-1234567890123456789012345678901234567890123456789012345678901234567890123400`, + expected: `-12,345,678,901,234,567,890,123,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678.901234`, + }, + { + shannons: `0`, + expected: `0`, + }, + { + shannons: `-0`, + expected: `0`, + }, + { + shannons: ``, + expected: `0`, + }, +] +export default fixtures diff --git a/packages/neuron-ui/src/tests/formatters/shannonToCKBFormatter/index.test.ts b/packages/neuron-ui/src/tests/formatters/shannonToCKBFormatter/index.test.ts new file mode 100644 index 0000000000..3787ca813a --- /dev/null +++ b/packages/neuron-ui/src/tests/formatters/shannonToCKBFormatter/index.test.ts @@ -0,0 +1,14 @@ +import { shannonToCKBFormatter } from 'utils/formatters' +import fixtures from './fixtures' + +const fixtureTable = fixtures.map(({ shannons, expected }) => [shannons, expected]) + +describe(`Verify shannon to CKB formatter`, () => { + test.each(fixtureTable)(`%s shannons => %s CKB without sign`, (shannons: string, expected: string) => { + expect(shannonToCKBFormatter(shannons)).toBe(expected) + }) + + test.each(fixtureTable)(`%s shannons => %s CKB with sign`, (shannons: string, expected: string) => { + expect(shannonToCKBFormatter(shannons, true)).toBe(+shannons > 0 ? `+${expected}` : expected) + }) +}) diff --git a/packages/neuron-ui/src/utils/formatters.ts b/packages/neuron-ui/src/utils/formatters.ts index bc4dfaadcc..a1baa6241a 100644 --- a/packages/neuron-ui/src/utils/formatters.ts +++ b/packages/neuron-ui/src/utils/formatters.ts @@ -163,7 +163,7 @@ export const addressesToBalance = (addresses: State.Address[] = []) => { .toString() } -export const outputsToTotalCapacity = (outputs: { amount: string; unit: CapacityUnit }[]) => { +export const outputsToTotalAmount = (outputs: { amount: string; unit: CapacityUnit }[]) => { const totalCapacity = outputs.reduce((total, cur) => { if (Number.isNaN(+cur.amount)) { return total @@ -192,6 +192,6 @@ export default { uniformTimeFormatter, priceToFee, addressesToBalance, - outputsToTotalCapacity, + outputsToTotalAmount, failureResToNotification, }