2023-11-09 00:20:43 +03:00
|
|
|
import { describe, expect, it } from 'vitest'
|
2022-06-30 16:32:56 +03:00
|
|
|
|
2023-11-09 00:20:43 +03:00
|
|
|
import { computeConstructorIdFromEntry } from './ctor-id.js'
|
|
|
|
import { TlArgument, TlEntry } from './index.js'
|
2021-11-23 00:03:59 +03:00
|
|
|
|
|
|
|
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('?')
|
2023-06-05 03:30:48 +03:00
|
|
|
|
2021-11-23 00:03:59 +03:00
|
|
|
if (t[1]) {
|
|
|
|
return {
|
|
|
|
name: a[0],
|
|
|
|
type: t[1],
|
2023-06-25 03:09:04 +03:00
|
|
|
typeModifiers: {
|
|
|
|
predicate: t[0],
|
|
|
|
},
|
|
|
|
} satisfies TlArgument
|
2023-06-05 03:30:48 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
name: a[0],
|
|
|
|
type: t[0],
|
2021-11-23 00:03:59 +03:00
|
|
|
}
|
|
|
|
}),
|
|
|
|
})
|
|
|
|
|
|
|
|
const test = (tl: TlEntry, expected: number) => {
|
2023-11-09 00:20:43 +03:00
|
|
|
expect(computeConstructorIdFromEntry(tl)).toEqual(expected)
|
2021-11-23 00:03:59 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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', () => {
|
2023-09-24 01:32:22 +03:00
|
|
|
test(make('auth.exportAuthorization', 'auth.ExportedAuthorization', 'dc_id:int'), 0xe5bfffcd)
|
2021-11-23 00:03:59 +03:00
|
|
|
})
|
|
|
|
|
|
|
|
it('computes for constructors with vector parameters', () => {
|
2023-09-24 01:32:22 +03:00
|
|
|
test(make('account.deleteSecureValue', 'Bool', 'types:Vector<SecureValueType>'), 0xb880bc4b)
|
2021-11-23 00:03:59 +03:00
|
|
|
})
|
|
|
|
|
|
|
|
it('computes for constructors with vector return type', () => {
|
2023-09-24 01:32:22 +03:00
|
|
|
test(make('account.getSecureValue', 'Vector<SecureValue>', 'types:Vector<SecureValueType>'), 0x73665bc2)
|
2021-11-23 00:03:59 +03:00
|
|
|
})
|
|
|
|
|
|
|
|
it('computes for constructors with optional parameters', () => {
|
|
|
|
test(
|
|
|
|
make(
|
|
|
|
'account.uploadTheme',
|
|
|
|
'Document',
|
|
|
|
'flags:#',
|
|
|
|
'file:InputFile',
|
|
|
|
'thumb:flags.0?InputFile',
|
|
|
|
'file_name:string',
|
2023-06-05 03:30:48 +03:00
|
|
|
'mime_type:string',
|
2021-11-23 00:03:59 +03:00
|
|
|
),
|
2023-06-05 03:30:48 +03:00
|
|
|
0x1c3db333,
|
2021-11-23 00:03:59 +03:00
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('computes for constructors with optional true parameters', () => {
|
|
|
|
test(
|
|
|
|
make(
|
|
|
|
'account.installTheme',
|
|
|
|
'Bool',
|
|
|
|
'flags:#',
|
|
|
|
'dark:flags.0?true',
|
|
|
|
'format:flags.1?string',
|
2023-06-05 03:30:48 +03:00
|
|
|
'theme:flags.1?InputTheme',
|
2021-11-23 00:03:59 +03:00
|
|
|
),
|
2023-06-05 03:30:48 +03:00
|
|
|
0x7ae43737,
|
2021-11-23 00:03:59 +03:00
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('computes for constructors with generics', () => {
|
|
|
|
const entry = make('invokeAfterMsg', 'X', 'msg_id:long', 'query:!X')
|
|
|
|
entry.generics = [
|
|
|
|
{
|
|
|
|
name: 'X',
|
2022-06-30 16:32:56 +03:00
|
|
|
type: 'Type',
|
|
|
|
},
|
2021-11-23 00:03:59 +03:00
|
|
|
]
|
|
|
|
test(entry, 0xcb9f372d)
|
|
|
|
})
|
|
|
|
})
|