const pa = Person.self('A');
const pb = Person.spouse('B');
const tr = new TaxReturn();
+ tr.addPerson(pa);
+ tr.addPerson(pb);
tr.addForm(new W2({
employer: 'AA',
employee: pa,
test('interest income', () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new Form1099INT({
payer: 'Bank',
payee: p,
test('dividend income', () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
const f1099div = new Form1099DIV({
payer: 'Brokerage',
payee: p,
test('capital gain/loss', () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new Form1040({ filingStatus: FilingStatus.Single }));
tr.addForm(new W2({
employer: 'Money',
test('require Form8959', () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new W2({
employer: 'Company',
employee: p,
test('backdoor and megabackdoor roth', () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new Form1099R({
payer: 'Roth',
payee: p,
readonly supportsMultipleCopies = true;
+ person() { return this.getInput('payee'); }
+
protected readonly _lines = {
'payer': new Input('payer'),
'recipient': new Input('payee'),
readonly supportsMultipleCopies = true;
+ person() { return this.getInput('payee'); }
+
protected readonly _lines = {
'payer': new Input('payer'),
'recipient': new Input('payee'),
readonly supportsMultipleCopies = true;
+ person() { return this.getInput('payee'); }
+
protected readonly _lines = {
'payer': new Input('payer'),
'recipient': new Input('payee'),
readonly supportsMultipleCopies = true;
+ person() { return this.getInput('payee'); }
+
protected readonly _lines = {
'payer': new Input('payer'),
'recipeint': new Input('payee'),
test('no net capital losses in total income', () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new Form1040({
filingStatus: FilingStatus.MarriedFilingJoint
}));
test('skip part 1', () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
const f = new Form8606({
person: p,
nondeductibleContributions: 6000,
test('Roth conversion no basis', () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
const f = new Form8606({
person: p,
nondeductibleContributions: 6000,
readonly supportsMultipleCopies = true;
+ person() { return this.getInput('person'); }
+
protected readonly _lines = {
'person': new Input('person'),
test(`box ${Form8949Box[box]}`, () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new Form1040({ filingStatus: FilingStatus.Single }));
tr.addForm(new Form1099B({
payer: 'Brokerage',
test('multiple forms', () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new Form1040({ filingStatus: FilingStatus.Single }));
tr.addForm(new Form1099B({
payer: 'Brokerage',
test('adjustments', () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new Form1040({ filingStatus: FilingStatus.Single }));
const b1 = new Form1099B({
payer: 'Brokerage',
test(`filing status ${filingStatus}`, () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new Form1040({ filingStatus }));
tr.addForm(new Form1099DIV({
payer: 'Brokerage',
test(`filing status ${filingStatus}`, () => {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new Form1040({ filingStatus }));
tr.addForm(new Form1099DIV({
payer: 'Brokerage',
for (const filingStatus of Object.values(FilingStatus)) {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new Form1040({ filingStatus }));
tr.addForm(new Form8949);
tr.addForm(new ScheduleD);
for (const filingStatus of Object.values(FilingStatus)) {
const p = Person.self('A');
const tr = new TaxReturn();
+ tr.addPerson(p);
tr.addForm(new Form1040({ filingStatus }));
tr.addForm(new Form8949);
tr.addForm(new ScheduleD);