Make core/TaxReturn an abstract class.
[ustaxlib.git] / src / fed2019 / Schedule3.test.ts
1 import { Person } from '../core';
2 import { NotFoundError } from '../core/Errors';
3
4 import Form1040, { FilingStatus } from './Form1040';
5 import Form1099DIV from './Form1099DIV';
6 import Form1116 from './Form1116';
7 import Form8949 from './Form8949';
8 import Schedule3 from './Schedule3';
9 import ScheduleD from './ScheduleD';
10 import TaxReturn from './TaxReturn';
11
12 test('foreign tax credit, form 1116 not required', () => {
13 const filingStatusToForeignTax = {
14 [FilingStatus.Single]: 200,
15 [FilingStatus.MarriedFilingJoint]: 500,
16 [FilingStatus.MarriedFilingSeparate]: 200
17 };
18
19 for (const filingStatus of Object.values(FilingStatus)) {
20 const p = Person.self('A');
21 const tr = new TaxReturn();
22 tr.addForm(new Form1040({ filingStatus }));
23 tr.addForm(new Form8949);
24 tr.addForm(new ScheduleD);
25 tr.addForm(new Form1099DIV({
26 payer: 'Brokerage',
27 payee: p,
28 ordinaryDividends: 200000,
29 qualifiedDividends: 70000,
30 totalCapitalGain: 300,
31 foreignTaxPaid: filingStatusToForeignTax[filingStatus],
32 }));
33 const f = new Schedule3();
34 tr.addForm(f);
35
36 expect(f.getValue(tr, '1')).toBe(filingStatusToForeignTax[filingStatus]);
37 }
38 });
39
40 test('foreign tax credit, form 1116 required', () => {
41 const filingStatusToForeignTax = {
42 [FilingStatus.Single]: 400,
43 [FilingStatus.MarriedFilingJoint]: 600,
44 [FilingStatus.MarriedFilingSeparate]: 400
45 };
46
47 for (const filingStatus of Object.values(FilingStatus)) {
48 const p = Person.self('A');
49 const tr = new TaxReturn();
50 tr.addForm(new Form1040({ filingStatus }));
51 tr.addForm(new Form8949);
52 tr.addForm(new ScheduleD);
53 tr.addForm(new Form1099DIV({
54 payer: 'Brokerage',
55 payee: p,
56 ordinaryDividends: 200000,
57 qualifiedDividends: 70000,
58 totalCapitalGain: 300,
59 foreignTaxPaid: filingStatusToForeignTax[filingStatus],
60 }));
61 const f = new Schedule3();
62 tr.addForm(f);
63
64 expect(() => f.getValue(tr, '1')).toThrow(NotFoundError);
65 }
66 });