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