Skip to content

Commit 5c4ff71

Browse files
committed
Add narrowing tests
1 parent 7c34b93 commit 5c4ff71

File tree

2 files changed

+332
-0
lines changed

2 files changed

+332
-0
lines changed

tests/rules/check-throws-tag-type.test.js

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1742,6 +1742,178 @@ ruleTester.run(
17421742
{ messageId: 'throwTypeMismatch' },
17431743
],
17441744
},
1745+
{
1746+
code: `
1747+
class TrueGetterError extends Error {}
1748+
class TrueSetterError extends Error {}
1749+
class FalseGetterError extends Error {}
1750+
class FalseSetterError extends Error {}
1751+
1752+
function foo() {
1753+
if (Math.random() > 0.5) {
1754+
return {
1755+
flag: true,
1756+
/**
1757+
* @throws {TrueGetterError}
1758+
*/
1759+
get value() {
1760+
throw new TrueGetterError();
1761+
},
1762+
/**
1763+
* @throws {TrueSetterError}
1764+
*/
1765+
set value(v: any) {
1766+
throw new TrueSetterError();
1767+
},
1768+
} as const;
1769+
} else {
1770+
return {
1771+
flag: false,
1772+
/**
1773+
* @throws {FalseGetterError}
1774+
*/
1775+
get value() {
1776+
throw new FalseGetterError();
1777+
},
1778+
/**
1779+
* @throws {FalseSetterError}
1780+
*/
1781+
set value(v: any) {
1782+
throw new FalseSetterError();
1783+
},
1784+
} as const;
1785+
}
1786+
}
1787+
1788+
/**
1789+
* @throws {TrueGetterError}
1790+
*/
1791+
function bar() {
1792+
const result = foo();
1793+
if (!result.flag) {
1794+
result.value;
1795+
}
1796+
}
1797+
1798+
/**
1799+
* @throws {FalseGetterError}
1800+
*/
1801+
function baz() {
1802+
const result = foo();
1803+
if (result.flag) {
1804+
result.value;
1805+
}
1806+
}
1807+
1808+
/**
1809+
* @throws {TrueSetterError}
1810+
*/
1811+
function qux() {
1812+
const result = foo();
1813+
if (!result.flag) {
1814+
result.value = 42;
1815+
}
1816+
}
1817+
1818+
/**
1819+
* @throws {FalseSetterError}
1820+
*/
1821+
function quux() {
1822+
const result = foo();
1823+
if (result.flag) {
1824+
result.value = 42;
1825+
}
1826+
}
1827+
`,
1828+
output: `
1829+
class TrueGetterError extends Error {}
1830+
class TrueSetterError extends Error {}
1831+
class FalseGetterError extends Error {}
1832+
class FalseSetterError extends Error {}
1833+
1834+
function foo() {
1835+
if (Math.random() > 0.5) {
1836+
return {
1837+
flag: true,
1838+
/**
1839+
* @throws {TrueGetterError}
1840+
*/
1841+
get value() {
1842+
throw new TrueGetterError();
1843+
},
1844+
/**
1845+
* @throws {TrueSetterError}
1846+
*/
1847+
set value(v: any) {
1848+
throw new TrueSetterError();
1849+
},
1850+
} as const;
1851+
} else {
1852+
return {
1853+
flag: false,
1854+
/**
1855+
* @throws {FalseGetterError}
1856+
*/
1857+
get value() {
1858+
throw new FalseGetterError();
1859+
},
1860+
/**
1861+
* @throws {FalseSetterError}
1862+
*/
1863+
set value(v: any) {
1864+
throw new FalseSetterError();
1865+
},
1866+
} as const;
1867+
}
1868+
}
1869+
1870+
/**
1871+
* @throws {FalseGetterError}
1872+
*/
1873+
function bar() {
1874+
const result = foo();
1875+
if (!result.flag) {
1876+
result.value;
1877+
}
1878+
}
1879+
1880+
/**
1881+
* @throws {TrueGetterError}
1882+
*/
1883+
function baz() {
1884+
const result = foo();
1885+
if (result.flag) {
1886+
result.value;
1887+
}
1888+
}
1889+
1890+
/**
1891+
* @throws {FalseSetterError}
1892+
*/
1893+
function qux() {
1894+
const result = foo();
1895+
if (!result.flag) {
1896+
result.value = 42;
1897+
}
1898+
}
1899+
1900+
/**
1901+
* @throws {TrueSetterError}
1902+
*/
1903+
function quux() {
1904+
const result = foo();
1905+
if (result.flag) {
1906+
result.value = 42;
1907+
}
1908+
}
1909+
`,
1910+
errors: [
1911+
{ messageId: 'throwTypeMismatch' },
1912+
{ messageId: 'throwTypeMismatch' },
1913+
{ messageId: 'throwTypeMismatch' },
1914+
{ messageId: 'throwTypeMismatch' },
1915+
],
1916+
},
17451917
],
17461918
},
17471919
);

tests/rules/no-undocumented-throws.test.js

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4023,6 +4023,166 @@ ruleTester.run(
40234023
{ messageId: 'missingThrowsTag' },
40244024
],
40254025
},
4026+
{
4027+
code: `
4028+
class TrueGetterError extends Error {}
4029+
class TrueSetterError extends Error {}
4030+
class FalseGetterError extends Error {}
4031+
class FalseSetterError extends Error {}
4032+
4033+
function foo() {
4034+
if (Math.random() > 0.5) {
4035+
return {
4036+
flag: true,
4037+
/**
4038+
* @throws {TrueGetterError}
4039+
*/
4040+
get value() {
4041+
throw new TrueGetterError();
4042+
},
4043+
/**
4044+
* @throws {TrueSetterError}
4045+
*/
4046+
set value(v: any) {
4047+
throw new TrueSetterError();
4048+
},
4049+
} as const;
4050+
} else {
4051+
return {
4052+
flag: false,
4053+
/**
4054+
* @throws {FalseGetterError}
4055+
*/
4056+
get value() {
4057+
throw new FalseGetterError();
4058+
},
4059+
/**
4060+
* @throws {FalseSetterError}
4061+
*/
4062+
set value(v: any) {
4063+
throw new FalseSetterError();
4064+
},
4065+
} as const;
4066+
}
4067+
}
4068+
4069+
function bar() {
4070+
const result = foo();
4071+
if (!result.flag) {
4072+
result.value;
4073+
}
4074+
}
4075+
4076+
function baz() {
4077+
const result = foo();
4078+
if (result.flag) {
4079+
result.value;
4080+
}
4081+
}
4082+
4083+
function qux() {
4084+
const result = foo();
4085+
if (!result.flag) {
4086+
result.value = 42;
4087+
}
4088+
}
4089+
4090+
function quux() {
4091+
const result = foo();
4092+
if (result.flag) {
4093+
result.value = 42;
4094+
}
4095+
}
4096+
`,
4097+
output: `
4098+
class TrueGetterError extends Error {}
4099+
class TrueSetterError extends Error {}
4100+
class FalseGetterError extends Error {}
4101+
class FalseSetterError extends Error {}
4102+
4103+
function foo() {
4104+
if (Math.random() > 0.5) {
4105+
return {
4106+
flag: true,
4107+
/**
4108+
* @throws {TrueGetterError}
4109+
*/
4110+
get value() {
4111+
throw new TrueGetterError();
4112+
},
4113+
/**
4114+
* @throws {TrueSetterError}
4115+
*/
4116+
set value(v: any) {
4117+
throw new TrueSetterError();
4118+
},
4119+
} as const;
4120+
} else {
4121+
return {
4122+
flag: false,
4123+
/**
4124+
* @throws {FalseGetterError}
4125+
*/
4126+
get value() {
4127+
throw new FalseGetterError();
4128+
},
4129+
/**
4130+
* @throws {FalseSetterError}
4131+
*/
4132+
set value(v: any) {
4133+
throw new FalseSetterError();
4134+
},
4135+
} as const;
4136+
}
4137+
}
4138+
4139+
/**
4140+
* @throws {FalseGetterError}
4141+
*/
4142+
function bar() {
4143+
const result = foo();
4144+
if (!result.flag) {
4145+
result.value;
4146+
}
4147+
}
4148+
4149+
/**
4150+
* @throws {TrueGetterError}
4151+
*/
4152+
function baz() {
4153+
const result = foo();
4154+
if (result.flag) {
4155+
result.value;
4156+
}
4157+
}
4158+
4159+
/**
4160+
* @throws {FalseSetterError}
4161+
*/
4162+
function qux() {
4163+
const result = foo();
4164+
if (!result.flag) {
4165+
result.value = 42;
4166+
}
4167+
}
4168+
4169+
/**
4170+
* @throws {TrueSetterError}
4171+
*/
4172+
function quux() {
4173+
const result = foo();
4174+
if (result.flag) {
4175+
result.value = 42;
4176+
}
4177+
}
4178+
`,
4179+
errors: [
4180+
{ messageId: 'missingThrowsTag' },
4181+
{ messageId: 'missingThrowsTag' },
4182+
{ messageId: 'missingThrowsTag' },
4183+
{ messageId: 'missingThrowsTag' },
4184+
],
4185+
},
40264186
{
40274187
code: `
40284188
const foo = {

0 commit comments

Comments
 (0)