traversal_test.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793
  1. package goquery
  2. import (
  3. "strings"
  4. "testing"
  5. )
  6. func TestFind(t *testing.T) {
  7. sel := Doc().Find("div.row-fluid")
  8. assertLength(t, sel.Nodes, 9)
  9. }
  10. func TestFindRollback(t *testing.T) {
  11. sel := Doc().Find("div.row-fluid")
  12. sel2 := sel.Find("a").End()
  13. assertEqual(t, sel, sel2)
  14. }
  15. func TestFindNotSelf(t *testing.T) {
  16. sel := Doc().Find("h1").Find("h1")
  17. assertLength(t, sel.Nodes, 0)
  18. }
  19. func TestFindInvalid(t *testing.T) {
  20. sel := Doc().Find(":+ ^")
  21. assertLength(t, sel.Nodes, 0)
  22. }
  23. func TestFindBig(t *testing.T) {
  24. doc := DocW()
  25. sel := doc.Find("li")
  26. assertLength(t, sel.Nodes, 373)
  27. sel2 := doc.Find("span")
  28. assertLength(t, sel2.Nodes, 448)
  29. sel3 := sel.FindSelection(sel2)
  30. assertLength(t, sel3.Nodes, 248)
  31. }
  32. func TestChainedFind(t *testing.T) {
  33. sel := Doc().Find("div.hero-unit").Find(".row-fluid")
  34. assertLength(t, sel.Nodes, 4)
  35. }
  36. func TestChainedFindInvalid(t *testing.T) {
  37. sel := Doc().Find("div.hero-unit").Find("")
  38. assertLength(t, sel.Nodes, 0)
  39. }
  40. func TestChildren(t *testing.T) {
  41. sel := Doc().Find(".pvk-content").Children()
  42. assertLength(t, sel.Nodes, 5)
  43. }
  44. func TestChildrenRollback(t *testing.T) {
  45. sel := Doc().Find(".pvk-content")
  46. sel2 := sel.Children().End()
  47. assertEqual(t, sel, sel2)
  48. }
  49. func TestContents(t *testing.T) {
  50. sel := Doc().Find(".pvk-content").Contents()
  51. assertLength(t, sel.Nodes, 13)
  52. }
  53. func TestContentsRollback(t *testing.T) {
  54. sel := Doc().Find(".pvk-content")
  55. sel2 := sel.Contents().End()
  56. assertEqual(t, sel, sel2)
  57. }
  58. func TestChildrenFiltered(t *testing.T) {
  59. sel := Doc().Find(".pvk-content").ChildrenFiltered(".hero-unit")
  60. assertLength(t, sel.Nodes, 1)
  61. }
  62. func TestChildrenFilteredInvalid(t *testing.T) {
  63. sel := Doc().Find(".pvk-content").ChildrenFiltered("")
  64. assertLength(t, sel.Nodes, 0)
  65. }
  66. func TestChildrenFilteredRollback(t *testing.T) {
  67. sel := Doc().Find(".pvk-content")
  68. sel2 := sel.ChildrenFiltered(".hero-unit").End()
  69. assertEqual(t, sel, sel2)
  70. }
  71. func TestContentsFiltered(t *testing.T) {
  72. sel := Doc().Find(".pvk-content").ContentsFiltered(".hero-unit")
  73. assertLength(t, sel.Nodes, 1)
  74. }
  75. func TestContentsFilteredInvalid(t *testing.T) {
  76. sel := Doc().Find(".pvk-content").ContentsFiltered("~")
  77. assertLength(t, sel.Nodes, 0)
  78. }
  79. func TestContentsFilteredRollback(t *testing.T) {
  80. sel := Doc().Find(".pvk-content")
  81. sel2 := sel.ContentsFiltered(".hero-unit").End()
  82. assertEqual(t, sel, sel2)
  83. }
  84. func TestChildrenFilteredNone(t *testing.T) {
  85. sel := Doc().Find(".pvk-content").ChildrenFiltered("a.btn")
  86. assertLength(t, sel.Nodes, 0)
  87. }
  88. func TestParent(t *testing.T) {
  89. sel := Doc().Find(".container-fluid").Parent()
  90. assertLength(t, sel.Nodes, 3)
  91. }
  92. func TestParentRollback(t *testing.T) {
  93. sel := Doc().Find(".container-fluid")
  94. sel2 := sel.Parent().End()
  95. assertEqual(t, sel, sel2)
  96. }
  97. func TestParentBody(t *testing.T) {
  98. sel := Doc().Find("body").Parent()
  99. assertLength(t, sel.Nodes, 1)
  100. }
  101. func TestParentFiltered(t *testing.T) {
  102. sel := Doc().Find(".container-fluid").ParentFiltered(".hero-unit")
  103. assertLength(t, sel.Nodes, 1)
  104. assertClass(t, sel, "hero-unit")
  105. }
  106. func TestParentFilteredInvalid(t *testing.T) {
  107. sel := Doc().Find(".container-fluid").ParentFiltered("")
  108. assertLength(t, sel.Nodes, 0)
  109. }
  110. func TestParentFilteredRollback(t *testing.T) {
  111. sel := Doc().Find(".container-fluid")
  112. sel2 := sel.ParentFiltered(".hero-unit").End()
  113. assertEqual(t, sel, sel2)
  114. }
  115. func TestParents(t *testing.T) {
  116. sel := Doc().Find(".container-fluid").Parents()
  117. assertLength(t, sel.Nodes, 8)
  118. }
  119. func TestParentsOrder(t *testing.T) {
  120. sel := Doc().Find("#cf2").Parents()
  121. assertLength(t, sel.Nodes, 6)
  122. assertSelectionIs(t, sel, ".hero-unit", ".pvk-content", "div.row-fluid", "#cf1", "body", "html")
  123. }
  124. func TestParentsRollback(t *testing.T) {
  125. sel := Doc().Find(".container-fluid")
  126. sel2 := sel.Parents().End()
  127. assertEqual(t, sel, sel2)
  128. }
  129. func TestParentsFiltered(t *testing.T) {
  130. sel := Doc().Find(".container-fluid").ParentsFiltered("body")
  131. assertLength(t, sel.Nodes, 1)
  132. }
  133. func TestParentsFilteredInvalid(t *testing.T) {
  134. sel := Doc().Find(".container-fluid").ParentsFiltered("")
  135. assertLength(t, sel.Nodes, 0)
  136. }
  137. func TestParentsFilteredRollback(t *testing.T) {
  138. sel := Doc().Find(".container-fluid")
  139. sel2 := sel.ParentsFiltered("body").End()
  140. assertEqual(t, sel, sel2)
  141. }
  142. func TestParentsUntil(t *testing.T) {
  143. sel := Doc().Find(".container-fluid").ParentsUntil("body")
  144. assertLength(t, sel.Nodes, 6)
  145. }
  146. func TestParentsUntilInvalid(t *testing.T) {
  147. sel := Doc().Find(".container-fluid").ParentsUntil("")
  148. assertLength(t, sel.Nodes, 8)
  149. }
  150. func TestParentsUntilRollback(t *testing.T) {
  151. sel := Doc().Find(".container-fluid")
  152. sel2 := sel.ParentsUntil("body").End()
  153. assertEqual(t, sel, sel2)
  154. }
  155. func TestParentsUntilSelection(t *testing.T) {
  156. sel := Doc().Find(".container-fluid")
  157. sel2 := Doc().Find(".pvk-content")
  158. sel = sel.ParentsUntilSelection(sel2)
  159. assertLength(t, sel.Nodes, 3)
  160. }
  161. func TestParentsUntilSelectionRollback(t *testing.T) {
  162. sel := Doc().Find(".container-fluid")
  163. sel2 := Doc().Find(".pvk-content")
  164. sel2 = sel.ParentsUntilSelection(sel2).End()
  165. assertEqual(t, sel, sel2)
  166. }
  167. func TestParentsUntilNodes(t *testing.T) {
  168. sel := Doc().Find(".container-fluid")
  169. sel2 := Doc().Find(".pvk-content, .hero-unit")
  170. sel = sel.ParentsUntilNodes(sel2.Nodes...)
  171. assertLength(t, sel.Nodes, 2)
  172. }
  173. func TestParentsUntilNodesRollback(t *testing.T) {
  174. sel := Doc().Find(".container-fluid")
  175. sel2 := Doc().Find(".pvk-content, .hero-unit")
  176. sel2 = sel.ParentsUntilNodes(sel2.Nodes...).End()
  177. assertEqual(t, sel, sel2)
  178. }
  179. func TestParentsFilteredUntil(t *testing.T) {
  180. sel := Doc().Find(".container-fluid").ParentsFilteredUntil(".pvk-content", "body")
  181. assertLength(t, sel.Nodes, 2)
  182. }
  183. func TestParentsFilteredUntilInvalid(t *testing.T) {
  184. sel := Doc().Find(".container-fluid").ParentsFilteredUntil("", "")
  185. assertLength(t, sel.Nodes, 0)
  186. }
  187. func TestParentsFilteredUntilRollback(t *testing.T) {
  188. sel := Doc().Find(".container-fluid")
  189. sel2 := sel.ParentsFilteredUntil(".pvk-content", "body").End()
  190. assertEqual(t, sel, sel2)
  191. }
  192. func TestParentsFilteredUntilSelection(t *testing.T) {
  193. sel := Doc().Find(".container-fluid")
  194. sel2 := Doc().Find(".row-fluid")
  195. sel = sel.ParentsFilteredUntilSelection("div", sel2)
  196. assertLength(t, sel.Nodes, 3)
  197. }
  198. func TestParentsFilteredUntilSelectionRollback(t *testing.T) {
  199. sel := Doc().Find(".container-fluid")
  200. sel2 := Doc().Find(".row-fluid")
  201. sel2 = sel.ParentsFilteredUntilSelection("div", sel2).End()
  202. assertEqual(t, sel, sel2)
  203. }
  204. func TestParentsFilteredUntilNodes(t *testing.T) {
  205. sel := Doc().Find(".container-fluid")
  206. sel2 := Doc().Find(".row-fluid")
  207. sel = sel.ParentsFilteredUntilNodes("body", sel2.Nodes...)
  208. assertLength(t, sel.Nodes, 1)
  209. }
  210. func TestParentsFilteredUntilNodesRollback(t *testing.T) {
  211. sel := Doc().Find(".container-fluid")
  212. sel2 := Doc().Find(".row-fluid")
  213. sel2 = sel.ParentsFilteredUntilNodes("body", sel2.Nodes...).End()
  214. assertEqual(t, sel, sel2)
  215. }
  216. func TestSiblings(t *testing.T) {
  217. sel := Doc().Find("h1").Siblings()
  218. assertLength(t, sel.Nodes, 1)
  219. }
  220. func TestSiblingsRollback(t *testing.T) {
  221. sel := Doc().Find("h1")
  222. sel2 := sel.Siblings().End()
  223. assertEqual(t, sel, sel2)
  224. }
  225. func TestSiblings2(t *testing.T) {
  226. sel := Doc().Find(".pvk-gutter").Siblings()
  227. assertLength(t, sel.Nodes, 9)
  228. }
  229. func TestSiblings3(t *testing.T) {
  230. sel := Doc().Find("body>.container-fluid").Siblings()
  231. assertLength(t, sel.Nodes, 0)
  232. }
  233. func TestSiblingsFiltered(t *testing.T) {
  234. sel := Doc().Find(".pvk-gutter").SiblingsFiltered(".pvk-content")
  235. assertLength(t, sel.Nodes, 3)
  236. }
  237. func TestSiblingsFilteredInvalid(t *testing.T) {
  238. sel := Doc().Find(".pvk-gutter").SiblingsFiltered("")
  239. assertLength(t, sel.Nodes, 0)
  240. }
  241. func TestSiblingsFilteredRollback(t *testing.T) {
  242. sel := Doc().Find(".pvk-gutter")
  243. sel2 := sel.SiblingsFiltered(".pvk-content").End()
  244. assertEqual(t, sel, sel2)
  245. }
  246. func TestNext(t *testing.T) {
  247. sel := Doc().Find("h1").Next()
  248. assertLength(t, sel.Nodes, 1)
  249. }
  250. func TestNextRollback(t *testing.T) {
  251. sel := Doc().Find("h1")
  252. sel2 := sel.Next().End()
  253. assertEqual(t, sel, sel2)
  254. }
  255. func TestNext2(t *testing.T) {
  256. sel := Doc().Find(".close").Next()
  257. assertLength(t, sel.Nodes, 1)
  258. }
  259. func TestNextNone(t *testing.T) {
  260. sel := Doc().Find("small").Next()
  261. assertLength(t, sel.Nodes, 0)
  262. }
  263. func TestNextFiltered(t *testing.T) {
  264. sel := Doc().Find(".container-fluid").NextFiltered("div")
  265. assertLength(t, sel.Nodes, 2)
  266. }
  267. func TestNextFilteredInvalid(t *testing.T) {
  268. sel := Doc().Find(".container-fluid").NextFiltered("")
  269. assertLength(t, sel.Nodes, 0)
  270. }
  271. func TestNextFilteredRollback(t *testing.T) {
  272. sel := Doc().Find(".container-fluid")
  273. sel2 := sel.NextFiltered("div").End()
  274. assertEqual(t, sel, sel2)
  275. }
  276. func TestNextFiltered2(t *testing.T) {
  277. sel := Doc().Find(".container-fluid").NextFiltered("[ng-view]")
  278. assertLength(t, sel.Nodes, 1)
  279. }
  280. func TestPrev(t *testing.T) {
  281. sel := Doc().Find(".red").Prev()
  282. assertLength(t, sel.Nodes, 1)
  283. assertClass(t, sel, "green")
  284. }
  285. func TestPrevRollback(t *testing.T) {
  286. sel := Doc().Find(".red")
  287. sel2 := sel.Prev().End()
  288. assertEqual(t, sel, sel2)
  289. }
  290. func TestPrev2(t *testing.T) {
  291. sel := Doc().Find(".row-fluid").Prev()
  292. assertLength(t, sel.Nodes, 5)
  293. }
  294. func TestPrevNone(t *testing.T) {
  295. sel := Doc().Find("h2").Prev()
  296. assertLength(t, sel.Nodes, 0)
  297. }
  298. func TestPrevFiltered(t *testing.T) {
  299. sel := Doc().Find(".row-fluid").PrevFiltered(".row-fluid")
  300. assertLength(t, sel.Nodes, 5)
  301. }
  302. func TestPrevFilteredInvalid(t *testing.T) {
  303. sel := Doc().Find(".row-fluid").PrevFiltered("")
  304. assertLength(t, sel.Nodes, 0)
  305. }
  306. func TestPrevFilteredRollback(t *testing.T) {
  307. sel := Doc().Find(".row-fluid")
  308. sel2 := sel.PrevFiltered(".row-fluid").End()
  309. assertEqual(t, sel, sel2)
  310. }
  311. func TestNextAll(t *testing.T) {
  312. sel := Doc().Find("#cf2 div:nth-child(1)").NextAll()
  313. assertLength(t, sel.Nodes, 3)
  314. }
  315. func TestNextAllRollback(t *testing.T) {
  316. sel := Doc().Find("#cf2 div:nth-child(1)")
  317. sel2 := sel.NextAll().End()
  318. assertEqual(t, sel, sel2)
  319. }
  320. func TestNextAll2(t *testing.T) {
  321. sel := Doc().Find("div[ng-cloak]").NextAll()
  322. assertLength(t, sel.Nodes, 1)
  323. }
  324. func TestNextAllNone(t *testing.T) {
  325. sel := Doc().Find(".footer").NextAll()
  326. assertLength(t, sel.Nodes, 0)
  327. }
  328. func TestNextAllFiltered(t *testing.T) {
  329. sel := Doc().Find("#cf2 .row-fluid").NextAllFiltered("[ng-cloak]")
  330. assertLength(t, sel.Nodes, 2)
  331. }
  332. func TestNextAllFilteredInvalid(t *testing.T) {
  333. sel := Doc().Find("#cf2 .row-fluid").NextAllFiltered("")
  334. assertLength(t, sel.Nodes, 0)
  335. }
  336. func TestNextAllFilteredRollback(t *testing.T) {
  337. sel := Doc().Find("#cf2 .row-fluid")
  338. sel2 := sel.NextAllFiltered("[ng-cloak]").End()
  339. assertEqual(t, sel, sel2)
  340. }
  341. func TestNextAllFiltered2(t *testing.T) {
  342. sel := Doc().Find(".close").NextAllFiltered("h4")
  343. assertLength(t, sel.Nodes, 1)
  344. }
  345. func TestPrevAll(t *testing.T) {
  346. sel := Doc().Find("[ng-view]").PrevAll()
  347. assertLength(t, sel.Nodes, 2)
  348. }
  349. func TestPrevAllOrder(t *testing.T) {
  350. sel := Doc().Find("[ng-view]").PrevAll()
  351. assertLength(t, sel.Nodes, 2)
  352. assertSelectionIs(t, sel, "#cf4", "#cf3")
  353. }
  354. func TestPrevAllRollback(t *testing.T) {
  355. sel := Doc().Find("[ng-view]")
  356. sel2 := sel.PrevAll().End()
  357. assertEqual(t, sel, sel2)
  358. }
  359. func TestPrevAll2(t *testing.T) {
  360. sel := Doc().Find(".pvk-gutter").PrevAll()
  361. assertLength(t, sel.Nodes, 6)
  362. }
  363. func TestPrevAllFiltered(t *testing.T) {
  364. sel := Doc().Find(".pvk-gutter").PrevAllFiltered(".pvk-content")
  365. assertLength(t, sel.Nodes, 3)
  366. }
  367. func TestPrevAllFilteredInvalid(t *testing.T) {
  368. sel := Doc().Find(".pvk-gutter").PrevAllFiltered("")
  369. assertLength(t, sel.Nodes, 0)
  370. }
  371. func TestPrevAllFilteredRollback(t *testing.T) {
  372. sel := Doc().Find(".pvk-gutter")
  373. sel2 := sel.PrevAllFiltered(".pvk-content").End()
  374. assertEqual(t, sel, sel2)
  375. }
  376. func TestNextUntil(t *testing.T) {
  377. sel := Doc().Find(".alert a").NextUntil("p")
  378. assertLength(t, sel.Nodes, 1)
  379. assertSelectionIs(t, sel, "h4")
  380. }
  381. func TestNextUntilInvalid(t *testing.T) {
  382. sel := Doc().Find(".alert a").NextUntil("")
  383. assertLength(t, sel.Nodes, 2)
  384. }
  385. func TestNextUntil2(t *testing.T) {
  386. sel := Doc().Find("#cf2-1").NextUntil("[ng-cloak]")
  387. assertLength(t, sel.Nodes, 1)
  388. assertSelectionIs(t, sel, "#cf2-2")
  389. }
  390. func TestNextUntilOrder(t *testing.T) {
  391. sel := Doc().Find("#cf2-1").NextUntil("#cf2-4")
  392. assertLength(t, sel.Nodes, 2)
  393. assertSelectionIs(t, sel, "#cf2-2", "#cf2-3")
  394. }
  395. func TestNextUntilRollback(t *testing.T) {
  396. sel := Doc().Find("#cf2-1")
  397. sel2 := sel.PrevUntil("#cf2-4").End()
  398. assertEqual(t, sel, sel2)
  399. }
  400. func TestNextUntilSelection(t *testing.T) {
  401. sel := Doc2().Find("#n2")
  402. sel2 := Doc2().Find("#n4")
  403. sel2 = sel.NextUntilSelection(sel2)
  404. assertLength(t, sel2.Nodes, 1)
  405. assertSelectionIs(t, sel2, "#n3")
  406. }
  407. func TestNextUntilSelectionRollback(t *testing.T) {
  408. sel := Doc2().Find("#n2")
  409. sel2 := Doc2().Find("#n4")
  410. sel2 = sel.NextUntilSelection(sel2).End()
  411. assertEqual(t, sel, sel2)
  412. }
  413. func TestNextUntilNodes(t *testing.T) {
  414. sel := Doc2().Find("#n2")
  415. sel2 := Doc2().Find("#n5")
  416. sel2 = sel.NextUntilNodes(sel2.Nodes...)
  417. assertLength(t, sel2.Nodes, 2)
  418. assertSelectionIs(t, sel2, "#n3", "#n4")
  419. }
  420. func TestNextUntilNodesRollback(t *testing.T) {
  421. sel := Doc2().Find("#n2")
  422. sel2 := Doc2().Find("#n5")
  423. sel2 = sel.NextUntilNodes(sel2.Nodes...).End()
  424. assertEqual(t, sel, sel2)
  425. }
  426. func TestPrevUntil(t *testing.T) {
  427. sel := Doc().Find(".alert p").PrevUntil("a")
  428. assertLength(t, sel.Nodes, 1)
  429. assertSelectionIs(t, sel, "h4")
  430. }
  431. func TestPrevUntilInvalid(t *testing.T) {
  432. sel := Doc().Find(".alert p").PrevUntil("")
  433. assertLength(t, sel.Nodes, 2)
  434. }
  435. func TestPrevUntil2(t *testing.T) {
  436. sel := Doc().Find("[ng-cloak]").PrevUntil(":not([ng-cloak])")
  437. assertLength(t, sel.Nodes, 1)
  438. assertSelectionIs(t, sel, "[ng-cloak]")
  439. }
  440. func TestPrevUntilOrder(t *testing.T) {
  441. sel := Doc().Find("#cf2-4").PrevUntil("#cf2-1")
  442. assertLength(t, sel.Nodes, 2)
  443. assertSelectionIs(t, sel, "#cf2-3", "#cf2-2")
  444. }
  445. func TestPrevUntilRollback(t *testing.T) {
  446. sel := Doc().Find("#cf2-4")
  447. sel2 := sel.PrevUntil("#cf2-1").End()
  448. assertEqual(t, sel, sel2)
  449. }
  450. func TestPrevUntilSelection(t *testing.T) {
  451. sel := Doc2().Find("#n4")
  452. sel2 := Doc2().Find("#n2")
  453. sel2 = sel.PrevUntilSelection(sel2)
  454. assertLength(t, sel2.Nodes, 1)
  455. assertSelectionIs(t, sel2, "#n3")
  456. }
  457. func TestPrevUntilSelectionRollback(t *testing.T) {
  458. sel := Doc2().Find("#n4")
  459. sel2 := Doc2().Find("#n2")
  460. sel2 = sel.PrevUntilSelection(sel2).End()
  461. assertEqual(t, sel, sel2)
  462. }
  463. func TestPrevUntilNodes(t *testing.T) {
  464. sel := Doc2().Find("#n5")
  465. sel2 := Doc2().Find("#n2")
  466. sel2 = sel.PrevUntilNodes(sel2.Nodes...)
  467. assertLength(t, sel2.Nodes, 2)
  468. assertSelectionIs(t, sel2, "#n4", "#n3")
  469. }
  470. func TestPrevUntilNodesRollback(t *testing.T) {
  471. sel := Doc2().Find("#n5")
  472. sel2 := Doc2().Find("#n2")
  473. sel2 = sel.PrevUntilNodes(sel2.Nodes...).End()
  474. assertEqual(t, sel, sel2)
  475. }
  476. func TestNextFilteredUntil(t *testing.T) {
  477. sel := Doc2().Find(".two").NextFilteredUntil(".even", ".six")
  478. assertLength(t, sel.Nodes, 4)
  479. assertSelectionIs(t, sel, "#n3", "#n5", "#nf3", "#nf5")
  480. }
  481. func TestNextFilteredUntilInvalid(t *testing.T) {
  482. sel := Doc2().Find(".two").NextFilteredUntil("", "")
  483. assertLength(t, sel.Nodes, 0)
  484. }
  485. func TestNextFilteredUntilRollback(t *testing.T) {
  486. sel := Doc2().Find(".two")
  487. sel2 := sel.NextFilteredUntil(".even", ".six").End()
  488. assertEqual(t, sel, sel2)
  489. }
  490. func TestNextFilteredUntilSelection(t *testing.T) {
  491. sel := Doc2().Find(".even")
  492. sel2 := Doc2().Find(".five")
  493. sel = sel.NextFilteredUntilSelection(".even", sel2)
  494. assertLength(t, sel.Nodes, 2)
  495. assertSelectionIs(t, sel, "#n3", "#nf3")
  496. }
  497. func TestNextFilteredUntilSelectionRollback(t *testing.T) {
  498. sel := Doc2().Find(".even")
  499. sel2 := Doc2().Find(".five")
  500. sel3 := sel.NextFilteredUntilSelection(".even", sel2).End()
  501. assertEqual(t, sel, sel3)
  502. }
  503. func TestNextFilteredUntilNodes(t *testing.T) {
  504. sel := Doc2().Find(".even")
  505. sel2 := Doc2().Find(".four")
  506. sel = sel.NextFilteredUntilNodes(".odd", sel2.Nodes...)
  507. assertLength(t, sel.Nodes, 4)
  508. assertSelectionIs(t, sel, "#n2", "#n6", "#nf2", "#nf6")
  509. }
  510. func TestNextFilteredUntilNodesRollback(t *testing.T) {
  511. sel := Doc2().Find(".even")
  512. sel2 := Doc2().Find(".four")
  513. sel3 := sel.NextFilteredUntilNodes(".odd", sel2.Nodes...).End()
  514. assertEqual(t, sel, sel3)
  515. }
  516. func TestPrevFilteredUntil(t *testing.T) {
  517. sel := Doc2().Find(".five").PrevFilteredUntil(".odd", ".one")
  518. assertLength(t, sel.Nodes, 4)
  519. assertSelectionIs(t, sel, "#n4", "#n2", "#nf4", "#nf2")
  520. }
  521. func TestPrevFilteredUntilInvalid(t *testing.T) {
  522. sel := Doc2().Find(".five").PrevFilteredUntil("", "")
  523. assertLength(t, sel.Nodes, 0)
  524. }
  525. func TestPrevFilteredUntilRollback(t *testing.T) {
  526. sel := Doc2().Find(".four")
  527. sel2 := sel.PrevFilteredUntil(".odd", ".one").End()
  528. assertEqual(t, sel, sel2)
  529. }
  530. func TestPrevFilteredUntilSelection(t *testing.T) {
  531. sel := Doc2().Find(".odd")
  532. sel2 := Doc2().Find(".two")
  533. sel = sel.PrevFilteredUntilSelection(".odd", sel2)
  534. assertLength(t, sel.Nodes, 2)
  535. assertSelectionIs(t, sel, "#n4", "#nf4")
  536. }
  537. func TestPrevFilteredUntilSelectionRollback(t *testing.T) {
  538. sel := Doc2().Find(".even")
  539. sel2 := Doc2().Find(".five")
  540. sel3 := sel.PrevFilteredUntilSelection(".even", sel2).End()
  541. assertEqual(t, sel, sel3)
  542. }
  543. func TestPrevFilteredUntilNodes(t *testing.T) {
  544. sel := Doc2().Find(".even")
  545. sel2 := Doc2().Find(".four")
  546. sel = sel.PrevFilteredUntilNodes(".odd", sel2.Nodes...)
  547. assertLength(t, sel.Nodes, 2)
  548. assertSelectionIs(t, sel, "#n2", "#nf2")
  549. }
  550. func TestPrevFilteredUntilNodesRollback(t *testing.T) {
  551. sel := Doc2().Find(".even")
  552. sel2 := Doc2().Find(".four")
  553. sel3 := sel.PrevFilteredUntilNodes(".odd", sel2.Nodes...).End()
  554. assertEqual(t, sel, sel3)
  555. }
  556. func TestClosestItself(t *testing.T) {
  557. sel := Doc2().Find(".three")
  558. sel2 := sel.Closest(".row")
  559. assertLength(t, sel2.Nodes, sel.Length())
  560. assertSelectionIs(t, sel2, "#n3", "#nf3")
  561. }
  562. func TestClosestNoDupes(t *testing.T) {
  563. sel := Doc().Find(".span12")
  564. sel2 := sel.Closest(".pvk-content")
  565. assertLength(t, sel2.Nodes, 1)
  566. assertClass(t, sel2, "pvk-content")
  567. }
  568. func TestClosestNone(t *testing.T) {
  569. sel := Doc().Find("h4")
  570. sel2 := sel.Closest("a")
  571. assertLength(t, sel2.Nodes, 0)
  572. }
  573. func TestClosestInvalid(t *testing.T) {
  574. sel := Doc().Find("h4")
  575. sel2 := sel.Closest("")
  576. assertLength(t, sel2.Nodes, 0)
  577. }
  578. func TestClosestMany(t *testing.T) {
  579. sel := Doc().Find(".container-fluid")
  580. sel2 := sel.Closest(".pvk-content")
  581. assertLength(t, sel2.Nodes, 2)
  582. assertSelectionIs(t, sel2, "#pc1", "#pc2")
  583. }
  584. func TestClosestRollback(t *testing.T) {
  585. sel := Doc().Find(".container-fluid")
  586. sel2 := sel.Closest(".pvk-content").End()
  587. assertEqual(t, sel, sel2)
  588. }
  589. func TestClosestSelectionItself(t *testing.T) {
  590. sel := Doc2().Find(".three")
  591. sel2 := sel.ClosestSelection(Doc2().Find(".row"))
  592. assertLength(t, sel2.Nodes, sel.Length())
  593. }
  594. func TestClosestSelectionNoDupes(t *testing.T) {
  595. sel := Doc().Find(".span12")
  596. sel2 := sel.ClosestSelection(Doc().Find(".pvk-content"))
  597. assertLength(t, sel2.Nodes, 1)
  598. assertClass(t, sel2, "pvk-content")
  599. }
  600. func TestClosestSelectionNone(t *testing.T) {
  601. sel := Doc().Find("h4")
  602. sel2 := sel.ClosestSelection(Doc().Find("a"))
  603. assertLength(t, sel2.Nodes, 0)
  604. }
  605. func TestClosestSelectionMany(t *testing.T) {
  606. sel := Doc().Find(".container-fluid")
  607. sel2 := sel.ClosestSelection(Doc().Find(".pvk-content"))
  608. assertLength(t, sel2.Nodes, 2)
  609. assertSelectionIs(t, sel2, "#pc1", "#pc2")
  610. }
  611. func TestClosestSelectionRollback(t *testing.T) {
  612. sel := Doc().Find(".container-fluid")
  613. sel2 := sel.ClosestSelection(Doc().Find(".pvk-content")).End()
  614. assertEqual(t, sel, sel2)
  615. }
  616. func TestClosestNodesItself(t *testing.T) {
  617. sel := Doc2().Find(".three")
  618. sel2 := sel.ClosestNodes(Doc2().Find(".row").Nodes...)
  619. assertLength(t, sel2.Nodes, sel.Length())
  620. }
  621. func TestClosestNodesNoDupes(t *testing.T) {
  622. sel := Doc().Find(".span12")
  623. sel2 := sel.ClosestNodes(Doc().Find(".pvk-content").Nodes...)
  624. assertLength(t, sel2.Nodes, 1)
  625. assertClass(t, sel2, "pvk-content")
  626. }
  627. func TestClosestNodesNone(t *testing.T) {
  628. sel := Doc().Find("h4")
  629. sel2 := sel.ClosestNodes(Doc().Find("a").Nodes...)
  630. assertLength(t, sel2.Nodes, 0)
  631. }
  632. func TestClosestNodesMany(t *testing.T) {
  633. sel := Doc().Find(".container-fluid")
  634. sel2 := sel.ClosestNodes(Doc().Find(".pvk-content").Nodes...)
  635. assertLength(t, sel2.Nodes, 2)
  636. assertSelectionIs(t, sel2, "#pc1", "#pc2")
  637. }
  638. func TestClosestNodesRollback(t *testing.T) {
  639. sel := Doc().Find(".container-fluid")
  640. sel2 := sel.ClosestNodes(Doc().Find(".pvk-content").Nodes...).End()
  641. assertEqual(t, sel, sel2)
  642. }
  643. func TestIssue26(t *testing.T) {
  644. img1 := `<img src="assets/images/gallery/thumb-1.jpg" alt="150x150" />`
  645. img2 := `<img alt="150x150" src="assets/images/gallery/thumb-1.jpg" />`
  646. cases := []struct {
  647. s string
  648. l int
  649. }{
  650. {s: img1 + img2, l: 2},
  651. {s: img1, l: 1},
  652. {s: img2, l: 1},
  653. }
  654. for _, c := range cases {
  655. doc, err := NewDocumentFromReader(strings.NewReader(c.s))
  656. if err != nil {
  657. t.Fatal(err)
  658. }
  659. sel := doc.Find("img[src]")
  660. assertLength(t, sel.Nodes, c.l)
  661. }
  662. }