mtcute/packages/tl-utils/tests/ctor-id.spec.ts
Alina Tumanova f5976a2d74
ESM + end-to-end tests (#11)
* feat: moved tl-runtime to esm and native ArrayBuffers

* feat: migration to esm

* fix(core): web-related fixes

* test: finally, some good fucking e2e

* chore: fixed linters etc

* ci: added e2e to ci

* build(tl): fixed gen-code on node 20

* fix: codegen Uint8Array, not Buffer

never `git reset --hard` kids

* build: only do type-aware linting for `packages/*`

* build: ignore no-unresolved in ci for e2e

* fix: node 16 doesn't have subtle crypto apparently?

* fix(tests): use Uint8Array

for gods sake please can i just merge this already

* ci: don't parallel tasks in ci

because machines are utter garbage and it may just randomly break

* ci: pass secrets to e2e tests

* ci: separate cli command for ci

apparently im retarded

* fix: run codegen in e2e

im actually retarded

* ci: more fixes for e2e

* ci: debugging stuff

* ci: still debugging

* ci: hopefully fix ci???
2023-10-16 19:23:53 +03:00

99 lines
2.9 KiB
TypeScript

import { expect } from 'chai'
import { describe, it } from 'mocha'
import { computeConstructorIdFromEntry, TlArgument, TlEntry } from '../src/index.js'
describe('computeConstructorIdFromEntry', () => {
const make = (name: string, type: string, ...args: string[]): TlEntry => ({
kind: 'class',
id: 0,
name,
type,
arguments: args.map((arg) => {
const a = arg.split(':')
const t = a[1].split('?')
if (t[1]) {
return {
name: a[0],
type: t[1],
typeModifiers: {
predicate: t[0],
},
} satisfies TlArgument
}
return {
name: a[0],
type: t[0],
}
}),
})
const test = (tl: TlEntry, expected: number) => {
expect(computeConstructorIdFromEntry(tl)).eq(expected)
}
it('computes for constructors without parameters', () => {
test(make('auth.logOut', 'Bool'), 0x5717da40)
test(make('auth.resetAuthorizations', 'Bool'), 0x9fab0d1a)
})
it('ignores existing constructor id', () => {
const entry = make('auth.logOut', 'Bool')
entry.id = 0xaef001df
test(entry, 0x5717da40)
})
it('computes for constructors with simple parameters', () => {
test(make('auth.exportAuthorization', 'auth.ExportedAuthorization', 'dc_id:int'), 0xe5bfffcd)
})
it('computes for constructors with vector parameters', () => {
test(make('account.deleteSecureValue', 'Bool', 'types:Vector<SecureValueType>'), 0xb880bc4b)
})
it('computes for constructors with vector return type', () => {
test(make('account.getSecureValue', 'Vector<SecureValue>', 'types:Vector<SecureValueType>'), 0x73665bc2)
})
it('computes for constructors with optional parameters', () => {
test(
make(
'account.uploadTheme',
'Document',
'flags:#',
'file:InputFile',
'thumb:flags.0?InputFile',
'file_name:string',
'mime_type:string',
),
0x1c3db333,
)
})
it('computes for constructors with optional true parameters', () => {
test(
make(
'account.installTheme',
'Bool',
'flags:#',
'dark:flags.0?true',
'format:flags.1?string',
'theme:flags.1?InputTheme',
),
0x7ae43737,
)
})
it('computes for constructors with generics', () => {
const entry = make('invokeAfterMsg', 'X', 'msg_id:long', 'query:!X')
entry.generics = [
{
name: 'X',
type: 'Type',
},
]
test(entry, 0xcb9f372d)
})
})