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