Implement Form.person() on fed2019 forms.
[ustaxlib.git] / src / fed2019 / Form8960.test.ts
1 import { Person } from '../core';
2
3 import W2 from './W2';
4 import Form1040, { FilingStatus } from './Form1040';
5 import Form1099B, { GainType } from './Form1099B';
6 import Form1099DIV from './Form1099DIV';
7 import Form1099INT from './Form1099INT';
8 import Form8949 from './Form8949';
9 import Form8959 from './Form8959';
10 import Form8960 from './Form8960';
11 import Schedule2 from './Schedule2';
12 import ScheduleD from './ScheduleD';
13 import TaxReturn from './TaxReturn';
14
15 describe('net investment income tax', () => {
16 const filingStatusToResult = {
17 [FilingStatus.Single]: 105555,
18 [FilingStatus.MarriedFilingJoint]: 55555,
19 [FilingStatus.MarriedFilingSeparate]: 180555,
20 };
21
22 for (const filingStatus of Object.values(FilingStatus)) {
23 test(`filing status ${filingStatus}`, () => {
24 const p = Person.self('A');
25 const tr = new TaxReturn();
26 tr.addPerson(p);
27 tr.addForm(new Form1040({ filingStatus }));
28 tr.addForm(new Form1099DIV({
29 payer: 'Brokerage',
30 payee: p,
31 ordinaryDividends: 2000,
32 qualifiedDividends: 1500,
33 totalCapitalGain: 55
34 }));
35 tr.addForm(new Form1099INT({
36 payer: 'Bank',
37 payee: p,
38 interest: 3000
39 }));
40 tr.addForm(new Form1099B({
41 payer: 'Brokerage',
42 payee: p,
43 description: '100 VTI',
44 proceeds: 4000,
45 costBasis: 3500,
46 gainType: GainType.LongTerm,
47 basisReportedToIRS: true
48 }));
49 tr.addForm(new Form8949);
50 tr.addForm(new ScheduleD);
51 tr.addForm(new W2({
52 employer: 'Acme',
53 employee: p,
54 wages: 300000,
55 fedIncomeTax: 0,
56 medicareWages: 0,
57 medicareTax: 0,
58 }));
59 tr.addForm(new Form8959);
60 tr.addForm(new Schedule2);
61
62 const f = new Form8960();
63 tr.addForm(f);
64
65 expect(f.getValue(tr, '1')).toBe(3000);
66 expect(f.getValue(tr, '2')).toBe(2000);
67 expect(f.getValue(tr, '5a')).toBe(555);
68 expect(f.getValue(tr, '8')).toBe(5555);
69 expect(f.getValue(tr, '11')).toBe(0);
70 expect(f.getValue(tr, '12')).toBe(5555);
71 expect(f.getValue(tr, '13')).toBe(305555);
72 expect(f.getValue(tr, '14')).toBe(Form8960.filingStatusLimit(filingStatus));
73 expect(f.getValue(tr, '15')).toBe(filingStatusToResult[filingStatus]);
74 expect(f.getValue(tr, '16')).toBe(5555);
75 expect(f.getValue(tr, '17')).toBe(5555 * 0.038);
76
77 expect(tr.getForm(Schedule2).getValue(tr, '8')).toBe(5555 * 0.038);
78 });
79 }
80 });
81
82 describe('no net investment income tax', () => {
83 for (const filingStatus of Object.values(FilingStatus)) {
84 test(`filing status ${filingStatus}`, () => {
85 const p = Person.self('A');
86 const tr = new TaxReturn();
87 tr.addPerson(p);
88 tr.addForm(new Form1040({ filingStatus }));
89 tr.addForm(new Form1099DIV({
90 payer: 'Brokerage',
91 payee: p,
92 ordinaryDividends: 2000,
93 qualifiedDividends: 1500,
94 totalCapitalGain: 55
95 }));
96 tr.addForm(new Form1099INT({
97 payer: 'Bank',
98 payee: p,
99 interest: 3000
100 }));
101 tr.addForm(new Form1099B({
102 payer: 'Brokerage',
103 payee: p,
104 description: '100 VTI',
105 proceeds: 4000,
106 costBasis: 3500,
107 gainType: GainType.LongTerm,
108 basisReportedToIRS: true
109 }));
110 tr.addForm(new Form8949);
111 tr.addForm(new ScheduleD);
112 tr.addForm(new W2({
113 employer: 'Acme',
114 employee: p,
115 wages: 70000,
116 fedIncomeTax: 0,
117 medicareWages: 0,
118 medicareTax: 0,
119 }));
120 tr.addForm(new Form8959);
121 tr.addForm(new Schedule2);
122
123 const f = new Form8960();
124 tr.addForm(f);
125
126 expect(f.getValue(tr, '17')).toBe(0);
127 expect(tr.getForm(Schedule2).getValue(tr, '8')).toBe(0);
128 });
129 }
130 });