NAME=tc
FILE=bins/mach0/objc-employee
ARGS=-b 64
CMDS=<<EOF
.ic*
ts Employee
ts NSString
EOF
EXPECT=<<EOF
pf "pppp*?w*?*?q firstName shortWord username wideWord (objc_class)isa _shortWord (NSString)_username (NSString)_firstName _wideWord"
pf "pqzd p0 p1 str len"
EOF
RUN

NAME=tc2
FILE=bins/mach0/objc-employee
BROKEN=1
CMDS=icc
EXPECT=<<EOF
@interface Employee : NSObject
{
  s Employee::(ivar)_shortWord
  @"NSString" Employee::(ivar)_username
  @"NSString" Employee::(ivar)_firstName
  Q Employee::(ivar)_wideWord
}
- (void) helloWorld
- (id) sayHello
- (unknown) p0
- (unknown) p1
- (unknown) p2
- (unknown) p3
- (unknown) base
- (id) username
- (void) setUsername:
- (id) firstName
- (void) setFirstName:
- (short) shortWord
- (unsigned long long) wideWord
+ (id) sayHello
@end
EOF
RUN

NAME=tc3
FILE=bins/mach0/objc-employee
CMDS=ic*
EXPECT=<<EOF
fs classes
f class.public.Employee @ 0x100001ae0
f super.public.Employee.NSObject @ 0x100003348
f field.Employee.Employee::_property_firstName @ 0xffffffffffffffff
f field.Employee.Employee::_property_shortWord @ 0xffffffffffffffff
f field.Employee.Employee::_property_username @ 0xffffffffffffffff
f field.Employee.Employee::_property_wideWord @ 0xffffffffffffffff
f field.Employee.isa @ 0xffffffffffffffff
f field.Employee.Employee::_ivar__shortWord @ 0x100003328
f field.Employee.Employee::_ivar__username @ 0x100003330
f field.Employee.Employee::_ivar__firstName @ 0x100003338
f field.Employee.Employee::_ivar__wideWord @ 0x100003340
f method.Employee.helloWorld @ 0x100001ae0
f method.Employee.sayHello @ 0x100001b10
f method.Employee.p0 @ 0x100001b40
f method.Employee.p1 @ 0x100001b60
f method.Employee.p2 @ 0x100001b80
f method.Employee.p3 @ 0x100001ba0
f method.Employee.base @ 0x100001bc0
f method.class.Employee.sayHello @ 0x100001be0
f method.Employee.username @ 0x100001c10
f method.Employee.setUsername: @ 0x100001c40
f method.Employee.firstName @ 0x100001c80
f method.Employee.setFirstName: @ 0x100001cb0
f method.Employee.shortWord @ 0x100001cf0
f method.Employee.wideWord @ 0x100001d10
td "struct Employee { void* firstName; void* shortWord; void* username; void* wideWord; struct objc_class * isa; short _shortWord; struct NSString* _username; struct NSString* _firstName; uint64_t _wideWord;};"
EOF
RUN

NAME=tc4
FILE=bins/mach0/objc-employee
CMDS=<<EOF
.ic*
tc Employee
tc NSString
EOF
EXPECT=<<EOF
struct Employee {
	void *firstName;
	void *shortWord;
	void *username;
	void *wideWord;
	struct objc_class *isa;
	short _shortWord;
	struct NSString *_username;
	struct NSString *_firstName;
	uint64_t _wideWord;
};
struct NSString {
	void *p0;
	size_t p1;
	char *str;
	int len;
};
EOF
RUN

NAME=tc iOS14 arm64
FILE=bins/mach0/objc-employee-ios14-arm64
CMDS=<<EOF
.ic*
tsc Employee
tsc NSString
EOF
EXPECT=<<EOF
struct Employee {
	void *firstName;
	void *shortWord;
	void *username;
	void *wideWord;
	struct objc_class *isa;
	short _shortWord;
	struct NSString *_username;
	struct NSString *_firstName;
	uint64_t _wideWord;
};
struct NSString {
	void *p0;
	size_t p1;
	char *str;
	int len;
};
EOF
RUN

NAME=tc2 iOS14 arm64
FILE=bins/mach0/objc-employee-ios14-arm64
CMDS=icc
BROKEN=1
EXPECT=<<EOF
@interface Employee : NSObject
{
  s Employee::(ivar)_shortWord
  @"NSString" Employee::(ivar)_username
  @"NSString" Employee::(ivar)_firstName
  Q Employee::(ivar)_wideWord
}
- (void) sayHello
- (void) helloWorld
- (unknown) p0
- (unknown) p1
- (unknown) p2
- (unknown) p3
- (unknown) base
- (id) username
- (void) setUsername:
- (id) firstName
- (void) setFirstName:
- (short) shortWord
- (unsigned long long) wideWord
- (void) .cxx_destruct
+ (void) sayHello
@end
EOF
RUN

NAME=tc3 iOS14 arm64
FILE=bins/mach0/objc-employee-ios14-arm64
CMDS=ic*
EXPECT=<<EOF
fs classes
f class.public.Employee @ 0x100007958
f super.public.Employee.NSObject @ 0x10000c238
f field.Employee.Employee::_property_firstName @ 0xffffffffffffffff
f field.Employee.Employee::_property_shortWord @ 0xffffffffffffffff
f field.Employee.Employee::_property_username @ 0xffffffffffffffff
f field.Employee.Employee::_property_wideWord @ 0xffffffffffffffff
f field.Employee.isa @ 0xffffffffffffffff
f field.Employee.Employee::_ivar__shortWord @ 0x10000c228
f field.Employee.Employee::_ivar__username @ 0x10000c22c
f field.Employee.Employee::_ivar__firstName @ 0x10000c230
f field.Employee.Employee::_ivar__wideWord @ 0x10000c234
f method.class.Employee.sayHello @ 0x100007958
f method.Employee.sayHello @ 0x100007984
f method.Employee.helloWorld @ 0x1000079b0
f method.Employee.p0 @ 0x1000079dc
f method.Employee.p1 @ 0x1000079f8
f method.Employee.p2 @ 0x100007a14
f method.Employee.p3 @ 0x100007a30
f method.Employee.base @ 0x100007a4c
f method.Employee.username @ 0x100007a64
f method.Employee.setUsername: @ 0x100007a8c
f method.Employee.firstName @ 0x100007ac4
f method.Employee.setFirstName: @ 0x100007aec
f method.Employee.shortWord @ 0x100007b24
f method.Employee.wideWord @ 0x100007b44
f method.Employee..cxx_destruct @ 0x100007b60
td "struct Employee { void* firstName; void* shortWord; void* username; void* wideWord; struct objc_class * isa; short _shortWord; struct NSString* _username; struct NSString* _firstName; uint64_t _wideWord;};"
EOF
RUN

NAME=tc4 iOS14 arm64
FILE=bins/mach0/objc-employee-ios14-arm64
CMDS=<<EOF
.ic*
tc Employee
tc NSString
EOF
EXPECT=<<EOF
struct Employee {
	void *firstName;
	void *shortWord;
	void *username;
	void *wideWord;
	struct objc_class *isa;
	short _shortWord;
	struct NSString *_username;
	struct NSString *_firstName;
	uint64_t _wideWord;
};
struct NSString {
	void *p0;
	size_t p1;
	char *str;
	int len;
};
EOF
RUN

NAME=tc iOS14 arm64e
FILE=bins/mach0/objc-employee-ios14-arm64e
CMDS=<<EOF
.ic*
tsc Employee
tsc NSString
EOF
EXPECT=<<EOF
struct Employee {
	void *firstName;
	void *shortWord;
	void *username;
	void *wideWord;
	struct objc_class *isa;
	short _shortWord;
	struct NSString *_username;
	struct NSString *_firstName;
	uint64_t _wideWord;
};
struct NSString {
	void *p0;
	size_t p1;
	char *str;
	int len;
};
EOF
RUN

NAME=tc2 iOS14 arm64e
FILE=bins/mach0/objc-employee-ios14-arm64e
CMDS=icc
BROKEN=1
EXPECT=<<EOF
@interface Employee
{
  s Employee::(ivar)_shortWord
  @"NSString" Employee::(ivar)_username
  @"NSString" Employee::(ivar)_firstName
  Q Employee::(ivar)_wideWord
}
- (void) sayHello
- (void) helloWorld
- (unknown) p0
- (unknown) p1
- (unknown) p2
- (unknown) p3
- (unknown) base
- (id) username
- (void) setUsername:
- (id) firstName
- (void) setFirstName:
- (short) shortWord
- (unsigned long long) wideWord
- (void) .cxx_destruct
+ (void) sayHello
@end
EOF
RUN

NAME=tc3 iOS14 arm64e
FILE=bins/mach0/objc-employee-ios14-arm64e
CMDS=ic*
EXPECT=<<EOF
fs classes
f class.public.Employee @ 0x1000079a8
f super.public.Employee.NSObject @ 0x10000c1e8
f field.Employee.Employee::_property_firstName @ 0xffffffffffffffff
f field.Employee.Employee::_property_shortWord @ 0xffffffffffffffff
f field.Employee.Employee::_property_username @ 0xffffffffffffffff
f field.Employee.Employee::_property_wideWord @ 0xffffffffffffffff
f field.Employee.isa @ 0xffffffffffffffff
f field.Employee.Employee::_ivar__shortWord @ 0x10000c1d8
f field.Employee.Employee::_ivar__username @ 0x10000c1dc
f field.Employee.Employee::_ivar__firstName @ 0x10000c1e0
f field.Employee.Employee::_ivar__wideWord @ 0x10000c1e4
f method.class.Employee.sayHello @ 0x1000079a8
f method.Employee.sayHello @ 0x1000079d8
f method.Employee.helloWorld @ 0x100007a08
f method.Employee.p0 @ 0x100007a38
f method.Employee.p1 @ 0x100007a54
f method.Employee.p2 @ 0x100007a70
f method.Employee.p3 @ 0x100007a8c
f method.Employee.base @ 0x100007aa8
f method.Employee.username @ 0x100007ac0
f method.Employee.setUsername: @ 0x100007ae8
f method.Employee.firstName @ 0x100007b24
f method.Employee.setFirstName: @ 0x100007b4c
f method.Employee.shortWord @ 0x100007b88
f method.Employee.wideWord @ 0x100007ba8
f method.Employee..cxx_destruct @ 0x100007bc4
td "struct Employee { void* firstName; void* shortWord; void* username; void* wideWord; struct objc_class * isa; short _shortWord; struct NSString* _username; struct NSString* _firstName; uint64_t _wideWord;};"
EOF
RUN

NAME=tc4 iOS14 arm64e
FILE=bins/mach0/objc-employee-ios14-arm64e
CMDS=<<EOF
.ic*
tc Employee
tc NSString
EOF
EXPECT=<<EOF
struct Employee {
	void *firstName;
	void *shortWord;
	void *username;
	void *wideWord;
	struct objc_class *isa;
	short _shortWord;
	struct NSString *_username;
	struct NSString *_firstName;
	uint64_t _wideWord;
};
struct NSString {
	void *p0;
	size_t p1;
	char *str;
	int len;
};
EOF
RUN

NAME=ttc typedef
FILE==
CMDS=<<EOF
td "typedef char *string;"
ttc string
EOF
EXPECT=<<EOF
typedef char * string;
EOF
RUN

NAME=ttj typedef
FILE==
CMDS=<<EOF
td "typedef char *string;"
ttj string
EOF
EXPECT=<<EOF
{"name":"string","type":"char *"}
EOF
RUN

NAME=test cmd tsc
FILE=bins/mach0/objc-employee
CMDS=<<EOF
.ic*
tsc Employee
EOF
EXPECT=<<EOF
struct Employee {
	void *firstName;
	void *shortWord;
	void *username;
	void *wideWord;
	struct objc_class *isa;
	short _shortWord;
	struct NSString *_username;
	struct NSString *_firstName;
	uint64_t _wideWord;
};
EOF
RUN

NAME=test cmd tf
FILE=bins/mach0/objc-employee
CMDS=<<EOF
tf main
tf entry0
EOF
EXPECT=<<EOF
int main(int argc, char **argv, char **envp);
EOF
RUN

NAME=test cmd tec
FILE==
CMDS=<<EOF
td "enum foo {bar = 1, cow = 3};"
tec foo
EOF
EXPECT=<<EOF
enum foo {
	bar = 0x1,
	cow = 0x3
};
EOF
RUN

NAME=test cmd tuc
FILE==
CMDS=<<EOF
td "union Data {int i; int j;};"
tuc Data
EOF
EXPECT=<<EOF
union Data {
	int i;
	int j;
};
EOF
RUN

NAME=test cmd tsj
FILE==
CMDS=<<EOF
td "struct foo {};"
tsj foo
td "struct foo2 {int a; int b;};"
tsj foo2
EOF
EXPECT=<<EOF
{"name":"foo","members":{}}
{"name":"foo2","members":{"a":"int","b":"int"}}
EOF
RUN
