Compare commits

..

1 Commits

Author SHA1 Message Date
Tiago Collot 8772f97d23 feat(hashcode): add README.md for new go exercise hashcode 2 years ago
  1. 57
      .github/ISSUE_TEMPLATE/bug_report.md
  2. 21
      .github/ISSUE_TEMPLATE/feature_request.md
  3. 46
      .github/workflows/docker-images.yml
  4. 50
      docs/reviews.md
  5. 2
      js/tests/Dockerfile
  6. 18
      js/tests/bloody-sunday_test.js
  7. 135
      js/tests/friend-support_test.mjs
  8. 147
      js/tests/gatecrashers_test.mjs
  9. 21
      js/tests/keycodes-symphony-dom_test.mjs
  10. 1
      js/tests/race_test.js
  11. 18
      js/tests/sunny-sunday_test.js
  12. 3
      js/tests/test.mjs
  13. 197
      js/tests/uninvited_test.mjs
  14. 37
      js/tests/veterinary_test.js
  15. 18
      sh/debian/configure.sh
  16. 2
      sh/debian/preseed.cfg
  17. 2
      sh/tests/Dockerfile
  18. 99
      sh/tests/append-output_test.sh
  19. 30
      sh/tests/array-selector_test.sh
  20. 54
      sh/tests/auto-exec-bin_test.sh
  21. 20
      sh/tests/auto-jobs_test.sh
  22. 34
      sh/tests/bin-status_test.sh
  23. 28
      sh/tests/burial_test.sh
  24. 86
      sh/tests/calculator_test.sh
  25. 16
      sh/tests/change-struct_test.sh
  26. 28
      sh/tests/check-user_test.sh
  27. 27
      sh/tests/comparator_test.sh
  28. 18
      sh/tests/count-files_test.sh
  29. 11
      sh/tests/custom-ls/folder1/.hidden
  30. 1
      sh/tests/custom-ls/folder1/asd
  31. 199
      sh/tests/custom-ls/folder1/hello
  32. 1
      sh/tests/custom-ls/folder1/ls-test
  33. 42
      sh/tests/custom-ls_test.sh
  34. 18
      sh/tests/details_test.sh
  35. 44
      sh/tests/dir-info_test.sh
  36. 37
      sh/tests/division_test.sh
  37. 15
      sh/tests/easy-conditions_test.sh
  38. 12
      sh/tests/easy-perm/example.txt
  39. 16
      sh/tests/easy-perm/example2.txt
  40. 17
      sh/tests/easy-perm_test.sh
  41. 28
      sh/tests/env-format_test.sh
  42. 38
      sh/tests/file-checker_test.sh
  43. 17
      sh/tests/file-details_test.sh
  44. 127
      sh/tests/file-researcher/facts.txt
  45. 28
      sh/tests/file-researcher_test.sh
  46. 16
      sh/tests/file-struct_test.sh
  47. 0
      sh/tests/find-files-extension/folder1/file1.txt
  48. 0
      sh/tests/find-files-extension/folder1/file2.txt
  49. 0
      sh/tests/find-files-extension/folder1/file3.txt
  50. 0
      sh/tests/find-files-extension/folder1/test4.sh
  51. 0
      sh/tests/find-files-extension/folder2/fileInsideAfolder4.txt
  52. 0
      sh/tests/find-files-extension/folder2/test.sh
  53. 0
      sh/tests/find-files-extension/folder2/testtxt/fileInsideAfolder5.txt
  54. 0
      sh/tests/find-files-extension/folder2/testtxt/test/fileInsideAfolder6.txt
  55. 0
      sh/tests/find-files-extension/folder2/testtxt/test/lol.sh
  56. 35
      sh/tests/find-files-extension_test.sh
  57. 0
      sh/tests/find-files/folder1/ab
  58. 0
      sh/tests/find-files/folder1/ac
  59. 0
      sh/tests/find-files/folder1/az
  60. 0
      sh/tests/find-files/folder1/bz
  61. 0
      sh/tests/find-files/folder1/cz
  62. 0
      sh/tests/find-files/folder1/za!
  63. 0
      sh/tests/find-files/folder2/aa/aa
  64. 0
      sh/tests/find-files/folder2/aa/az
  65. 0
      sh/tests/find-files/folder2/aa/ba/ab
  66. 0
      sh/tests/find-files/folder2/aa/ba/bz
  67. 0
      sh/tests/find-files/folder2/ab
  68. 0
      sh/tests/find-files/folder2/ac
  69. 0
      sh/tests/find-files/folder2/alphabet
  70. 0
      sh/tests/find-files/folder2/az
  71. 0
      sh/tests/find-files/folder2/ba/aa/alphabetz!
  72. 0
      sh/tests/find-files/folder2/ba/aa/cz
  73. 0
      sh/tests/find-files/folder2/ba/aa/za!
  74. 0
      sh/tests/find-files/folder2/ba/ac
  75. 0
      sh/tests/find-files/folder2/ba/alphabetz
  76. 0
      sh/tests/find-files/folder2/bz
  77. 0
      sh/tests/find-files/folder2/cz
  78. 0
      sh/tests/find-files/folder2/za!
  79. 35
      sh/tests/find-files_test.sh
  80. 88
      sh/tests/grades_test.sh
  81. 29
      sh/tests/greatest-of-all_test.sh
  82. 19
      sh/tests/hard-conditions_test.sh
  83. 0
      sh/tests/hard-perm/0/.gitkeep
  84. 0
      sh/tests/hard-perm/1
  85. 0
      sh/tests/hard-perm/2
  86. 0
      sh/tests/hard-perm/3/.gitkeep
  87. 0
      sh/tests/hard-perm/4
  88. 0
      sh/tests/hard-perm/5
  89. 0
      sh/tests/hard-perm/6
  90. 0
      sh/tests/hard-perm/7
  91. 0
      sh/tests/hard-perm/8
  92. 0
      sh/tests/hard-perm/9
  93. 0
      sh/tests/hard-perm/A/.gitkeep
  94. 17
      sh/tests/hard-perm_test.sh
  95. 28
      sh/tests/head-and-tail_test.sh
  96. 24
      sh/tests/hello-devops_test.sh
  97. 40
      sh/tests/in-back-ground_test.sh
  98. 29
      sh/tests/in-the-dark_test.sh
  99. 20
      sh/tests/input-redirection_test.sh
  100. 69
      sh/tests/joker-num_test.sh
  101. Some files were not shown because too many files changed in this diff diff.show_more

57
.github/ISSUE_TEMPLATE/bug_report.md

@ -1,53 +1,32 @@
---
name: 🐛 Bug report
about: Create a report to help us improve
title: "[BUG] "
labels: "🐛 bug"
assignees: ""
---
### Environment
**Describe the bug**
A clear and concise description of what the bug/error is.
Device (web, mobile):
**Users**
Usernames of students/admin that are affected by the issue:
Operating system (Windows, macOS, Linux):
**Severity**
Choose the severity label (❗minor), (‼ major), or (⚠ critical).
Browser (Chrome, Firefox, Safari, Brave):
**Type**
Choose the label (🖌 ui), (⚙ functionality), (🗂 documentation), or (🔐 security)
### Steps to reproduce the issue = what action results in the issue
**To Reproduce**
Steps to reproduce the behavior:
URL of the page:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
Steps to follow:
**Workarounds**
Any known workarounds for the issue:
1.
2.
**Expected behavior**
A clear and concise description of what you expected to happen.
Usernames of students that are affected by the issue:
**Attachments**
If applicable, add screenshots/videos/logs to help explain your problem.
<sub>Using tools like [Loom](https://chrome.google.com/webstore/detail/loom-for-chrome/liecbddmkiiihnedobmlmillhodjkdmb)</sub>
### Expected Result = How the software should have performed
**Desktop (please complete the following information):**
What was the expected outcome of the action taken in `step 3` ?
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
### Actual Result = How the software actually performed
**Smartphone (please complete the following information):**
Actual outcome of the action taken in `step 3`
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
Error message that appears (if applicable)
**Additional context**
Add any other context about the problem here.
### Visual Proof
Screenshots & Videos (using [Loom](https://chrome.google.com/webstore/detail/loom-for-chrome/liecbddmkiiihnedobmlmillhodjkdmb))

21
.github/ISSUE_TEMPLATE/feature_request.md

@ -1,28 +1,11 @@
---
name: 🪄 Feature request
about: Suggest a feature or an enhancement for this project
title: "[FEATURE] "
labels: "🪄 feature"
assignees: ""
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Type**
Choose the label (🖌 ui), (⚙ functionality), (🗂 documentation), or (🔐 security)
**Expected benefit**
A clear and concise description of the expected benefit of the feature, including any relevant metrics or data to support its value:
**Target audience**
Who will benefit from this feature (e.g. users, developers, administrators):
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context & attachments**
Add any other context, screenshots, or additional attachments, such as mockups or prototypes, to provide more context for the feature.
**Additional context**
Add any other context or screenshots about the feature request here.

46
.github/workflows/docker-images.yml

@ -1,46 +0,0 @@
name: Docker Image CI
on:
push:
branches: ['master']
pull_request:
branches: ['master']
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to docker.01-edu.org Registry
uses: docker/login-action@v2.1.0
with:
registry: docker.01-edu.org
username: ${{ secrets.USER_DOCKER_01EDU_ORG }}
password: ${{ secrets.SECRET_DOCKER_01EDU_ORG }}
- name: Build the Sh Docker image
if: always()
run: |
docker build sh/tests/ --file sh/tests/Dockerfile --tag ghcr.io/01-edu/test-sh:latest
docker push ghcr.io/01-edu/test-sh:latest
- name: Build the JS Docker image
if: always()
run: |
docker build js/tests/ --file js/tests/Dockerfile --tag ghcr.io/01-edu/test-js:latest
docker push ghcr.io/01-edu/test-js:latest
- name: Build the DOM Docker image
if: always()
run: |
docker build . --file dom/Dockerfile --tag ghcr.io/01-edu/test-dom:latest
docker push ghcr.io/01-edu/test-dom:latest

50
docs/reviews.md

@ -1,50 +0,0 @@
# Reviews
## Context
Only unblocked bonus exercises can be reviewed, which are usually the last items of a quest.
Bonus exercises are available in quests 02 / 03 / 04 / 05 / 07 / 08 / 09.
<img width="1073" alt="Screenshot 2019-10-17 at 02.43.31" src="img/reviews/Screenshot 2019-10-17 at 02.43.31.jpg">
Making a review involves 2 students who are going to review each other's exercise.
Each user has to :
- **check** the code of the other one on Gitea. **You must add your reviewer as contributor in your repository so he/she can see your code**.
- **bet** if it is going to fail or succeed in the Review interface.
- **run** his own exercise in the Review interface to give a result to compare with the bet, and state if it was right or wrong.
## Usage
To submit an exercise to review and be reviewed, go to the `Review panel` on the right of the quest interface and click on the button to submit it :
<img width="1073" alt="Screenshot 2019-10-17 at 01.59.32" src="img/reviews/Screenshot 2019-10-17 at 01.59.32.jpg">
Then, when a match with another student who also wants to review is found, you will be notified :
<img width="1073" alt="Screenshot 2019-10-17 at 02.03.11" src="img/reviews/Screenshot 2019-10-17 at 02.03.11.jpg">
Once you and the other student have confirmed the match, you can go and check the code of the other student on their repository in the component `Your review` :
<img width="1073" alt="Screenshot 2019-10-17 at 02.05.46" src="img/reviews/Screenshot 2019-10-17 at 02.05.46.jpg">
When you have checked their code, those 4 steps will have to be completed to achieve the review :
- You have to bet if the exercise of the other student will fail or succeed after running the tester
- The other student has to do the same with your exercise and make his own bet, that you will see on the component `Review of your exercise`
<img width="1073" alt="Screenshot 2019-10-17 at 02.20.18" src="img/reviews/Screenshot 2019-10-17 at 02.20.18.jpg">
- Once the other student's bet is set, the tester button unblocks and you have to run it on your exercise to output the result determining if your exercise has failed or succeeded ; this result is compared to the other student's bet to determine if it was wrong or right
- The other student also has to run the tester on their exercise to determine their result and so whether your bet was wrong or right
<img width="1073" alt="Screenshot 2019-10-17 at 02.22.30" src="img/reviews/Screenshot 2019-10-17 at 02.22.30.jpg">
A bet is considered succeeded if it is equal to the tester output :
<img width="1073" alt="Screenshot 2019-10-17 at 02.24.04" src="img/reviews/Screenshot 2019-10-17 at 02.24.04.jpg">
You can have those 4 cases :
| bet | tester output | bet result |
| ------- | ------------- | ------------- |
| fail | failed | **succeeded** |
| fail | succeeded | **failed** |
| succeed | succeeded | **succeeded** |
| succeed | failed | **failed** |

2
js/tests/Dockerfile

@ -1,4 +1,4 @@
FROM docker.01-edu.org/alpine:3.17.0
FROM alpine:3.16.0
# Installs latest Chromium package.
RUN apk add --no-cache \

18
js/tests/bloody-sunday_test.js

@ -0,0 +1,18 @@
export const tests = []
const t = (f) => tests.push(f)
t(() => bloodySunday(new Date('0001-01-01')) === 'Monday')
t(() => bloodySunday(new Date('0001-01-02')) === 'Tuesday')
t(() => bloodySunday(new Date('0001-01-03')) === 'Wednesday')
t(() => bloodySunday(new Date('0001-01-04')) === 'Thursday')
t(() => bloodySunday(new Date('0001-01-05')) === 'Friday')
t(() => bloodySunday(new Date('0001-01-06')) === 'Saturday')
t(() => bloodySunday(new Date('0001-01-07')) === 'Monday')
t(() => bloodySunday(new Date('0001-12-01')) === 'Friday')
t(() => bloodySunday(new Date('1664-08-09')) === 'Saturday')
t(() => bloodySunday(new Date('2020-01-01')) === 'Monday')
t(() => bloodySunday(new Date('2048-12-08')) === 'Thursday')
Object.freeze(tests)

135
js/tests/friend-support_test.mjs

@ -1,135 +0,0 @@
import { once } from 'node:events'
import { spawn } from 'node:child_process'
import { mkdir, writeFile, chmod } from 'fs/promises'
import { join } from 'path'
export const tests = []
const fetch = _fetch // to redefine the real fetch
const port = 5000
export const setup = async ({ randStr }) => {
const dir = '.'
await mkdir(`${dir}/guests`, { recursive: true })
const randLastName = randStr()
const createFilesIn = ({ files, dirPath }) => {
Promise.all(
files.map(([fileName, content]) =>
writeFile(`${dirPath}/${fileName}`, JSON.stringify(content)),
),
)
}
const sendRequest = async (path, options) => {
const response = await fetch(`http://localhost:${port}${path}`, options)
const { status } = response
const headers = Object.fromEntries(response.headers)
let body = ''
try {
body = await response.json()
} catch (err) {
body = err
}
return { status, body, headers }
}
const startServer = async path => {
const server = spawn('node', [`${path}`])
const message = await Promise.race([
once(server.stdout, 'data'),
Promise.race([
once(server.stderr, 'data').then(String).then(Error),
once(server, 'error'),
]).then(result => Promise.reject(result)),
])
return { server, message }
}
return { tmpPath: dir, createFilesIn, randLastName, sendRequest, startServer }
}
const isServerRunningWell = async ({ path, ctx }) => {
const { server, message } = await ctx.startServer(path)
server.kill()
return message[0].toString().includes(port)
}
const testOneGuest = async ({ path, eq, ctx, randStr }) => {
const { server } = await ctx.startServer(path)
const randMsg = randStr()
const expBody = { message: randMsg }
const files = [[`mario_${ctx.randLastName}.json`, expBody]]
const dirName = 'guests'
const dirPath = join(ctx.tmpPath, dirName)
await ctx.createFilesIn({ dirPath, files })
const { status, body, headers } = await ctx.sendRequest(
`/mario_${ctx.randLastName}`,
{
method: 'GET',
},
)
server.kill()
return eq(
{
status: status,
body: body,
contentType: headers['content-type'],
},
{
status: 200,
body: expBody,
contentType: 'application/json',
},
)
}
const testServerFail = async ({ path, eq, ctx }) => {
const { server } = await ctx.startServer(path)
await chmod(`${ctx.tmpPath}/guests/mario_${ctx.randLastName}.json`, 0)
const { status, body, headers } = await ctx.sendRequest(
`/mario_${ctx.randLastName}`,
{
method: 'GET',
},
)
server.kill()
return eq(
{
status: status,
body: body,
contentType: headers['content-type'],
},
{
status: 500,
body: { error: 'server failed' },
contentType: 'application/json',
},
)
}
const testGuestNotThere = async ({ path, eq, ctx }) => {
const { server } = await ctx.startServer(path)
const { status, body, headers } = await ctx.sendRequest('/andrea_bianchi', {
method: 'GET',
})
server.kill()
return eq(
{
status: status,
body: body,
contentType: headers['content-type'],
},
{
status: 404,
body: { error: 'guest not found' },
contentType: 'application/json',
},
)
}
tests.push(isServerRunningWell, testOneGuest, testServerFail, testGuestNotThere)
Object.freeze(tests)

147
js/tests/gatecrashers_test.mjs

@ -1,147 +0,0 @@
import { once } from 'node:events'
import { spawn } from 'node:child_process'
import { mkdir, writeFile, access } from 'fs/promises'
import { join } from 'path'
export const tests = []
const fetch = _fetch // to redefine the real fetch
const port = 5000
export const setup = async ({}) => {
const dir = '.'
await mkdir(`${dir}/guests`, { recursive: true })
const createFilesIn = ({ files, dirPath }) =>
Promise.all(
files.map(([fileName, content]) =>
writeFile(`${dirPath}/${fileName}`, JSON.stringify(content)),
),
)
const sendRequest = async (path, options) => {
const response = await fetch(`http://localhost:${port}${path}`, options)
const { status } = response
const headers = Object.fromEntries(response.headers)
let body = ''
try {
body = await response.json()
} catch (err) {
body = err
}
return { status, body, headers }
}
const sendRequestWithAuth = async (guestName, auth, body) => {
let options = {
method: 'POST',
headers: {
body: JSON.stringify(body),
},
}
if (auth.len !== 0) {
options.headers.authorization =
'Basic ' + Buffer.from(auth).toString('base64')
}
return sendRequest(guestName, options)
}
const startServer = async path => {
const server = spawn('node', [`${path}`])
const message = await Promise.race([
once(server.stdout, 'data'),
Promise.race([
once(server.stderr, 'data').then(String).then(Error),
once(server, 'error'),
]).then(result => Promise.reject(result)),
])
return { server, message }
}
return {
tmpPath: dir,
createFilesIn,
sendRequest,
sendRequestWithAuth,
startServer,
}
}
const isServerRunningWell = async ({ path, ctx }) => {
const { server, message } = await ctx.startServer(path)
server.kill()
return message[0].toString().includes(port)
}
const testGoodRequests = async ({ path, eq, fail, ctx }) => {
const expectedBody = {
answer: 'yes',
drink: 'juice',
food: 'pizza',
}
const dirName = 'guests'
const dirPath = join(ctx.tmpPath, dirName)
const { server } = await ctx.startServer(path)
const newGuestNames = ['Ana_Riber', 'Rob_Frie', 'George_Harl']
const auths = [
'Caleb_Squires:abracadabra',
'Tyrique_Dalton:abracadabra',
'Rahima_Young:abracadabra',
]
for (var i = 0; i < 3; i++) {
const { status, body, headers } = await ctx.sendRequestWithAuth(
`/${newGuestNames[i]}`,
`${auths[i]}`,
expectedBody,
)
fail(await access(`${dirPath}/${newGuestNames[i]}.json`))
eq(
{ status: status, contentType: headers['content-type'], body: body },
{ status: 200, contentType: 'application/json', body: expectedBody },
)
}
server.kill()
return true
}
const testUnauthorizedRequests = async ({ path, eq, ctx }) => {
const body = {
answer: 'yes',
drink: 'juice',
food: 'pizza',
}
const { server } = await ctx.startServer(path)
const newGuestNames = [
'Super_Mario',
'Super_Mario',
'Super_Mario',
'Super_Mario',
]
const auths = [
'',
'LetMePass',
'Rahima_Young:wrongpass',
'Anonymus:abracadabra',
]
for (var i = 0; i < 3; i++) {
const { status } = await ctx.sendRequestWithAuth(
`/${newGuestNames[i]}`,
`${auths[i]}`,
body,
)
eq({ status: status }, { status: 401 })
}
server.kill()
return true
}
tests.push(isServerRunningWell, testGoodRequests, testUnauthorizedRequests)
Object.freeze(tests)

21
js/tests/keycodes-symphony-dom_test.mjs

@ -1,12 +1,11 @@
export const tests = []
export const setup = async () => {
const getNotes = async (page) =>
await page.$$eval('.note', (nodes) => {
return nodes.map((note) => note.textContent)
})
return { getNotes }
}
export const setup = async ({ page }) => ({
getNotes: async () =>
await page.$$eval('.note', (nodes) => {
return nodes.map((note) => note.textContent)
}),
})
const characters = `didyouhandlethekeydowneventcorrectly`
@ -15,7 +14,7 @@ tests.push(async ({ page, eq, ctx }) => {
for (const [i, character] of characters.split('').entries()) {
await page.keyboard.down(character)
const typed = characters.slice(0, i + 1).split('')
eq(await ctx.getNotes(page), typed)
eq(await ctx.getNotes(), typed)
}
})
@ -25,7 +24,7 @@ tests.push(async ({ page, eq, ctx }) => {
while (step < 10) {
await page.keyboard.down('Backspace')
const typed = characters.slice(0, characters.length - step).split('')
eq(await ctx.getNotes(page), typed)
eq(await ctx.getNotes(), typed)
step++
}
})
@ -33,8 +32,8 @@ tests.push(async ({ page, eq, ctx }) => {
tests.push(async ({ page, eq, ctx }) => {
// check that all the notes are cleared when Escape key is pressed
await page.keyboard.down('Escape')
const cleared = (await ctx.getNotes(page)).length === 0
eq(cleared, true)
const cleared = (await ctx.getNotes()).length === 0
eq(await cleared, true)
})
tests.push(async ({ page, eq }) => {

1
js/tests/race_test.js

@ -1,3 +1,4 @@
Promise.race = undefined
// /*/ // ⚡
export const tests = []
const t = (f) => tests.push(f)

18
js/tests/sunny-sunday_test.js

@ -1,18 +0,0 @@
export const tests = []
const t = (f) => tests.push(f)
t(() => sunnySunday(new Date('0001-01-01')) === 'Monday')
t(() => sunnySunday(new Date('0001-01-02')) === 'Tuesday')
t(() => sunnySunday(new Date('0001-01-03')) === 'Wednesday')
t(() => sunnySunday(new Date('0001-01-04')) === 'Thursday')
t(() => sunnySunday(new Date('0001-01-05')) === 'Friday')
t(() => sunnySunday(new Date('0001-01-06')) === 'Saturday')
t(() => sunnySunday(new Date('0001-01-07')) === 'Monday')
t(() => sunnySunday(new Date('0001-12-01')) === 'Friday')
t(() => sunnySunday(new Date('1664-08-09')) === 'Saturday')
t(() => sunnySunday(new Date('2020-01-01')) === 'Monday')
t(() => sunnySunday(new Date('2048-12-08')) === 'Thursday')
Object.freeze(tests)

3
js/tests/test.mjs

@ -8,7 +8,6 @@ import http from 'http'
import fs from 'fs'
global.window = global
global._fetch = fetch
global.fetch = url => {
// this is a fake implementation of fetch for the tester
// -> refer to https://devdocs.io/javascript/global_objects/fetch
@ -180,7 +179,7 @@ const runTests = async ({ url, path, code }) => {
new Promise((s, f) => {
timeout = setTimeout(f, 60000, Error('Time limit reached (1min)'))
}),
])
])
if (!(await waitWithTimeout) && !isDOM) {
throw Error('Test failed')
}

197
js/tests/uninvited_test.mjs

@ -1,197 +0,0 @@
import { once } from 'node:events'
import { spawn } from 'node:child_process'
import { mkdir, writeFile, chmod } from 'fs/promises'
import { join } from 'path'
import fs from 'node:fs/promises'
export const tests = []
const fetch = _fetch // to redefine the real fetch
const port = 5000
export const setup = async ({ randStr }) => {
const dir = '.'
await mkdir(`${dir}/guests`, { recursive: true })
const randomName = randStr()
const createFilesIn = ({ files, dirPath }) => {
Promise.all(
files.map(([fileName, content]) =>
writeFile(`${dirPath}/${fileName}`, JSON.stringify(content), {
flag: 'wx',
}),
),
).catch(reason => console.log(reason))
return true
}
const sendRequest = async (path, options) => {
const response = await fetch(`http://localhost:${port}${path}`, options)
const { status } = response
const headers = Object.fromEntries(response.headers)
let body = ''
try {
body = await response.json()
} catch (err) {
body = err
}
return { status, body, headers }
}
const startServer = async path => {
const server = spawn('node', [`${path}`])
const message = await Promise.race([
once(server.stdout, 'data'),
Promise.race([
once(server.stderr, 'data').then(String).then(Error),
once(server, 'error'),
]).then(result => Promise.reject(result)),
])
return { server, message }
}
return { tmpPath: dir, createFilesIn, randomName, sendRequest, startServer }
}
const testServerRunning = async ({ path, ctx }) => {
const { server, message } = await ctx.startServer(path)
server.kill()
return message[0].toString().includes(port)
}
const testRightStatusCode = async ({ path, ctx, randStr }) => {
const { server } = await ctx.startServer(path)
const { status } = await ctx.sendRequest(`/${ctx.randomName}`, {
method: 'POST',
headers: {
'content-type': 'application/json',
},
body: randStr(),
})
server.kill()
if (status != 201) return false
return true
}
const testRightContentType = async ({ path, ctx, randStr }) => {
const { server } = await ctx.startServer(path)
const { headers } = await ctx.sendRequest(`/${ctx.randomName}`, {
method: 'POST',
headers: {
'content-type': 'application/json',
},
body: randStr(),
})
server.kill()
if (headers['content-type'] != 'application/json') return false
return true
}
const testServerFail = async ({ path, eq, ctx, randStr }) => {
const { server } = await ctx.startServer(path)
await chmod(`${ctx.tmpPath}/guests`, 0).catch(reason => console.log(reason))
const { status, body, headers } = await ctx.sendRequest(
`/${ctx.randomName}`,
{
method: 'POST',
body: randStr(),
},
)
await chmod(`${ctx.tmpPath}/guests`, 0o777)
server.kill()
return eq(
{
status: status,
body: body,
'content-type': headers['content-type'],
},
{
status: 500,
body: { error: 'server failed' },
'content-type': 'application/json',
},
)
}
const testFileCreated = async ({ path, ctx, randStr }) => {
const { server } = await ctx.startServer(path)
const randomName = randStr()
await ctx.sendRequest(`/${randomName}`, {
body: randStr(),
method: 'POST',
})
const dirName = 'guests'
const dirPath = join(ctx.tmpPath, dirName)
let accessWorked = true
server.kill()
await fs
.access(`${dirPath}/${randomName}.json`, fs.constants.F_OK)
.catch(reason => {
accessWorked = false
console.log(reason)
})
return accessWorked
}
const testFileContent = async ({ path, ctx, randStr }) => {
const { server } = await ctx.startServer(path)
const randomName = randStr()
const body = randStr()
await ctx.sendRequest(`/${randomName}`, {
body: body,
method: 'POST',
})
const dirName = 'guests'
const dirPath = join(ctx.tmpPath, dirName)
server.kill()
let content = ''
await fs
.readFile(`./${dirPath}/${randomName}.json`, 'utf8', (err, data) => {
if (err) {
console.error(err)
return 'error when reading file'
}
return data
})
.then(data => {
if (data === 'error when reading file') return
content = data
})
return body === content
}
const testBodyOnSuccess = async ({ path, ctx, eq, randStr }) => {
const { server } = await ctx.startServer(path)
const randomBody = { message: randStr() }
const { body } = await ctx.sendRequest(`/${ctx.randomName}`, {
method: 'POST',
headers: {
'content-type': 'application/json',
},
body: JSON.stringify(randomBody),
})
server.kill()
return eq(
{
body: body,
},
{
body: randomBody,
},
)
}
tests.push(
testServerRunning,
testRightStatusCode,
testRightContentType,
testBodyOnSuccess,
testFileCreated,
testFileContent,
testServerFail,
)
Object.freeze(tests)

37
js/tests/veterinary_test.js

@ -1,37 +0,0 @@
export const tests = []
const testProperties = () => {
return (
Array.isArray(veterinary.animalKnowledge) &&
typeof veterinary.canTreat === 'function' &&
typeof veterinary.respondClient === 'function'
)
}
const testCanTreat = () => {
veterinary.animalKnowledge.push('dog', 'cat', 'elephant')
return (
veterinary.canTreat('dog') &&
veterinary.canTreat('cat') &&
veterinary.canTreat('elephant') &&
!veterinary.canTreat('') &&
!veterinary.canTreat('goldfish')
)
}
const testRespondClient = () => {
veterinary.animalKnowledge.push('parrot')
const vetResponse1 = veterinary.respondClient('Jack', 'parrot')
const vetResponse2 = veterinary.respondClient('Matias', 'cobra')
return (
vetResponse1.includes('Jack') &&
vetResponse1.toLowerCase().includes('yes') &&
vetResponse2.includes('Matias') &&
vetResponse2.toLowerCase().includes('no')
)
}
tests.push(testProperties, testCanTreat, testRespondClient)
Object.freeze(tests)

18
sh/debian/configure.sh diff.vendored

@ -258,23 +258,9 @@ function deployCore() {
# Deploy Runner
echo -e "Deploying Runner service: \n "
cd /root/core/runner
# Get the latest release version tag and create latest branch
tag=$(git describe --tags $(git rev-list --tags --max-count=1))
git checkout $tag -b latest
git describe --tags
# Set upstream to latest
git branch --set-upstream-to=origin/latest latest
# Get user auth infor for the runner
echo -e "Enter the runner Registry password: "
read registryPassword
echo -e "Enter the runner GitHub username: "
read githubUsername
echo -e "Enter the runner GitHub token: "
read githubToken
REGISTRY_PASSWORD=$registryPassword GITHUB_USERNAME=$githubUsername GITHUB_TOKEN=$githubToken ./run.sh
REGISTRY_PASSWORD=$registryPassword ./run.sh
echo -e "Runner service is up! \n"
}
@ -303,7 +289,7 @@ function clonePlatform() {
echo "Enter the target directory for the platform $(tput setaf 2)[System: $(pwd)/$(hostname)]$(tput sgr0):"
read serverDir
git clone git@github.com:01-edu/all.git $serverDir
cd $serverDir
cd /$serverDir
# Generate platform environment file automatically
./generate_env.sh --gen
}

2
sh/debian/preseed.cfg diff.vendored

@ -2,7 +2,7 @@
d-i anna/choose_modules string network-console
d-i preseed/early_command string anna-install network-console
d-i network-console/authorized_keys_url string https://github.com/frenchris.keys
d-i network-console/authorized_keys_url string https://github.com/{Frenchris,kigiri,HarryVasanth}.keys
d-i network-console/password-disabled boolean true
d-i debian-installer/locale string en_US

2
sh/tests/Dockerfile

@ -1,7 +1,7 @@
FROM docker.01-edu.org/debian:10.9-slim
RUN apt-get update
RUN apt-get -y install jq curl tree apt-utils
RUN apt-get -y install jq curl
WORKDIR /app/assets/superhero
RUN curl --remote-name --location https://demo.01-edu.org/assets/superhero/all.json

99
sh/tests/append-output_test.sh

@ -1,99 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/append-output.sh"
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
if test ! -e append-output; then
mkdir append-output
cat <<EOF >append-output/results.txt
"In the End" - Linkin Park
"Crawling" - Linkin Park
"Elevation" - U2
"Get the Party Started" - Pink
"Lady Marmalade" - Christina Aguilera, Lil' Kim, Mya, Pink
EOF
cat <<EOF >append-output/songs.txt
"Breathe" - Faith Hill
"It Wasn't Me" - Shaggy featuring Ricardo "RikRok" Ducent
"Hanging by a Moment" - Lifehouse
"Shape of My Heart" - Backstreet Boys
"Thank You" - Dido
"I'm Like a Bird" - Nelly Furtado
"Family Affair" - Mary J. Blige
"Fallin'" - Alicia Keys
"All for You" - Janet Jackson
"I Wanna Know" - Joe
"U Remind Me" - Usher
"U Got It Bad" - Usher
"I'm a Believer" - Smash Mouth
"Get the Party Started" - Pink
"Wherever You Will Go" - The Calling
"In the End" - Linkin Park
"Loser" - Beck
"Get Ur Freak On" - Missy Elliott
"I'm Real" - Jennifer Lopez
"Butterfly" - Crazy Town
"Crawling" - Linkin Park
"I'm a Slave 4 U" - Britney Spears
"Elevation" - U2
"Lady Marmalade" - Christina Aguilera, Lil' Kim, Mya, Pink
"Play" - Jennifer Lopez
"I'm Just a Kid" - Simple Plan
"Imitation of Life" - R.E.M.
"Big Pimpin'" - Jay-Z
"Stutter" - Joe featuring Mystikal
"I Wish" - R. Kelly
"This Is the Night" - Clay Aiken
"Hella Good" - No Doubt
"I Know" - Dionne Farris
"I'll Be Missing You" - Puff Daddy and Faith Evans featuring 112
"I Try" - Macy Gray
"Thong Song" - Sisqo
"Survivor" - Destiny's Child
"I Want It That Way" - Backstreet Boys
"Bad Day" - Daniel Powter
"I'm Like a Bird" - Nelly Furtado
"I Need to Know" - Marc Anthony
"Follow Me" - Uncle Kracker
"Hemorrhage (In My Hands)" - Fuel
"Soak Up the Sun" - Sheryl Crow
"I Hope You Dance" - Lee Ann Womack
"Can't Get You Out of My Head" - Kylie Minogue
"I Just Wanna Love U (Give It 2 Me)" - Jay-Z
"My Love Is Your Love" - Whitney Houston
"Bounce with Me" - Lil' Bow Wow
"Where the Party At" - Jagged Edge
"I'm Already There" - Lonestar
"I Don't Want to Miss a Thing" - Aerosmith
"If You Could Read My Mind" - Stars on 54
"My Way" - Usher
"Always on Time" - Ja Rule featuring Ashanti
EOF
fi
challenge() {
$(cd "$1" && bash "$script_dirS"/$FILENAME)
submitted=$(cat $1/results.txt)
rm $1"/results.txt"
$(cd "$1" && bash "$script_dirS"/solutions/append-output.sh)
expected=$(cat $1/results.txt)
diff <(echo "$submitted") <(echo "$expected")
}
if [ -s ${FILENAME} ]; then
if [[ $(cat $FILENAME | grep "cat <<EOF >results.txt" | wc -l) -ne 0 ]]; then
echo "cheating is not allowed in this exercise!"
exit 1
elif
[[ $(cat $FILENAME | grep echo | wc -l) -ne 0 ]]
then
echo "cheating is not allowed in this exercise!"
exit 1
fi
fi
challenge append-output
rm -r append-output

30
sh/tests/array-selector_test.sh

@ -1,30 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
submitted=$(bash "$script_dirS"/student/array-selector.sh "$@")
expected=$(bash "$script_dirS"/solutions/array-selector.sh "$@")
diff <(echo "$submitted") <(echo "$expected")
}
# Test with numbers - out of range included
for num in {0..6}
do
challenge $num
done
# Test with a value that is not a digit
challenge "abc"
# Test with wrong number of arguments
challenge

54
sh/tests/auto-exec-bin_test.sh

@ -1,54 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/auto-exec-bin.sh"
BINFILE="~/myBins/01exec"
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
setupbin() {
if [ -f ${BINFILE} ]; then
echo "bin already exists!"
else
mkdir -p ~/myBins
echo "echo Hello 01 Scripting Pool" > $HOME/myBins/01exec
fi
chmod +x $HOME/myBins/01exec
}
challenge() {
OLD_PATH=$PATH
# run soultion script
source "$script_dirS"/$FILENAME
submitted=$(cd / && 01exec)
PATH=$OLD_PATH
# run student script
source "$script_dirS"/solutions/auto-exec-bin.sh
expected=$(cd / && 01exec)
# diff
diff <(echo "$submitted") <(echo "$expected")
}
# True if FILE exists and is a regular file
if [ -f ${FILENAME} ]; then
# FILE exists and it's not empty
if [ -s ${FILENAME} ]; then
if [[ $(cat $FILENAME | grep echo | wc -l) -ne 0 ]]; then
echo "echo is not allowed in this exercise!"
exit 1
fi
setupbin
challenge
else
echo "The file exist but is empty"
exit 1
fi
else
echo "File does not exist"
exit 1
fi

20
sh/tests/auto-jobs_test.sh

@ -1,20 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
print_content() {
mkdir -p uncompressed
tar -xpf auto-jobs.tar -C uncompressed
cat -e uncompressed/$1
}
for i in 1 2 3 4
do
submitted=$(cd student && print_content task$i)
expected=$(cd solutions && print_content task$i)
diff <(echo "$submitted") <(echo "$expected")
done

34
sh/tests/bin-status_test.sh

@ -1,34 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/bin-status.sh"
challenge() {
submitted=$(eval "$@" >/dev/null 2>&1 ; source $FILENAME)
expected=$(eval "$@" >/dev/null 2>&1 ; source solutions/bin-status.sh)
diff <(echo "$submitted") <(echo "$expected")
}
# True if FILE exists and is a regular file
if [ -f ${FILENAME} ]; then
# FILE exists and it's not empty
if [ -s ${FILENAME} ]; then
challenge true
challenge false
challenge ls -l
challenge ls asdasdasdasdad
else
echo "The file exist but is empty"
exit 1
fi
else
echo "File does not exist"
exit 1
fi

28
sh/tests/burial_test.sh

@ -1,28 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/burial.sh"
# True if FILE exists and is a regular file
if [ -f ${FILENAME} ]; then
# FILE exists and it's not empty
if [ -s ${FILENAME} ]; then
if [[ $(cat $FILENAME | grep echo | wc -l) -ne 0 ]]; then
echo "echo is not allowed in this exercise!"
exit 1
fi
submitted=$(bash $FILENAME)
expected=$(bash solutions/burial.sh)
diff <(echo "$submitted") <(echo "$expected")
else
echo "The file exist but is empty"
exit 1
fi
else
echo "File does not exist"
exit 1
fi

86
sh/tests/calculator_test.sh

@ -1,86 +0,0 @@
#!/usr/bin/env bash
# set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
submitted="./calculator.sh $@
"
expected="./calculator.sh $@
"
submitted+=$(2>&1 bash "$script_dirS"/student/calculator.sh "$@")
submitted+="
exit status: $?"
expected+=$(2>&1 bash "$script_dirS"/solutions/calculator.sh "$@")
expected+="
exit status: $?"
diff -U 1 <(echo "$submitted") <(echo "$expected")
if [ $? != 0 ]
then
exit 1
fi
}
# Check if student uses case statement
if [[ $(cat "$script_dirS"/student/calculator.sh | grep case | wc -l) -eq 0 ]]
then
echo "Error: the use of case statement is mandatory"
exit 1
fi
# Valid inputs
challenge "15" "+" "10"
challenge "15" "-" "10"
challenge "15" "/" "10"
challenge "15" "*" "10"
challenge "3491" "+" "-67"
challenge "3491" "-" "-67"
challenge "3491" "/" "-67"
challenge "3491" "*" "-67"
challenge "-3491" "+" "-67"
challenge "-3491" "-" "-67"
challenge "-3491" "/" "-67"
challenge "-3491" "*" "-67"
# Invalid inputs
challenge
challenge "-3491" "*" "-67" "10" "12"
challenge "20" "/" "0"
challenge "20" "@" "10"
challenge "10" "*" "67invalid"
# Test operators functions
source $script_dirS"/student/calculator.sh" 10 + 10 >/dev/null 2>&1
if [ $(do_add 11 14) != 25 ]
then
echo "error in function do_add"
exit 1
fi
if [ $(do_sub 11 14) != -3 ]
then
echo "error in function do_sub"
exit 1
fi
if [ $(do_mult 3 5) != 15 ]
then
echo "error in function do_mult"
exit 1
fi
if [ $(do_divide 50 5) != 10 ]
then
echo "error in function do_divide"
exit 1
fi

16
sh/tests/change-struct_test.sh

@ -1,16 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
print_content() {
mkdir -p uncompressed
tar -xpf change-struct.tar -C uncompressed
tree uncompressed
}
submitted=$(cd student && print_content)
expected=$(cd solutions && print_content)
diff <(echo "$submitted") <(echo "$expected")

28
sh/tests/check-user_test.sh

@ -1,28 +0,0 @@
#!/usr/bin/env bash
# set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
submitted="./check-user.sh $@
"
expected="./check-user.sh $@
"
submitted+=$(bash 2>&1 "$script_dirS"/student/check-user.sh "$@")
expected+=$(bash 2>&1 "$script_dirS"/solutions/check-user.sh "$@")
diff -U 1 <(echo "$submitted") <(echo "$expected")
}
challenge "-i" "root"
challenge "-e" "root"
challenge "-i" "unknown_not_found"
challenge "-e" "unknown_not_found"
challenge
challenge "-i" "root" "too" "many" "args"
challenge "-t" "root"

27
sh/tests/comparator_test.sh

@ -1,27 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
submitted=$(bash $script_dirS/student/comparator.sh "$@")
expected=$(bash $script_dirS/solutions/comparator.sh "$@")
diff <(echo "$submitted") <(echo "$expected")
}
for i in $(seq 1 10); do
n1=$(shuf -i 1-20 -n 1)
n2=$(shuf -i 1-30 -n 1)
challenge $n1 $n2
done
challenge "0" "0"
challenge "10" "10"
challenge "-11" "-11"
challenge "14"
challenge "-11" "-11" "4"
challenge "as" "str"

18
sh/tests/count-files_test.sh

@ -1,18 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
submitted=$(cd "$1" && bash "$script_dirS"/student/count-files.sh)
expected=$(cd "$1" && bash "$script_dirS"/solutions/count-files.sh)
diff <(echo "$submitted") <(echo "$expected")
}
challenge cl-camp5/folder1
challenge cl-camp5/folder2

11
sh/tests/custom-ls/folder1/.hidden

@ -1,11 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum venenatis rutrum vehicula. Phasellus vehicula sagittis nibh, sed congue turpis suscipit a. Etiam sed nibh risus. Aenean aliquet urna ornare nisi bibendum, nec vehicula quam sagittis. Quisque varius vel tortor et rhoncus. Aliquam erat volutpat. Quisque sit amet cursus tortor.
Aenean egestas dui est, eu vehicula mi vehicula vitae. Nunc rhoncus sit amet libero id tempus. Fusce mollis at urna sit amet iaculis. Ut dapibus sed enim eu fringilla. Proin pretium, orci eget mollis viverra, nibh nunc feugiat purus, vel consequat felis magna ac felis. Nam gravida imperdiet arcu. Aliquam est felis, iaculis non felis id, cursus convallis metus. Phasellus ac varius arcu. Aenean congue nisi ut urna tempor tempor. Mauris sit amet purus non risus auctor ultricies imperdiet vitae ex. Vestibulum maximus eros quam, a luctus massa condimentum ac. In commodo consequat diam, at rutrum massa interdum non. In sed rutrum dolor.
Ut auctor porta felis, luctus ullamcorper ipsum pulvinar ac. Curabitur non pharetra purus. Nulla euismod leo nec massa convallis, ac facilisis orci lacinia. Maecenas eget magna tristique, eleifend est vehicula, mattis lectus. Etiam lectus sem, rutrum in nisl vitae, congue tincidunt urna. Praesent luctus auctor arcu, quis tristique ex suscipit eleifend. Phasellus congue tempus nisi vitae suscipit. Quisque ut luctus ipsum. Duis eget consequat massa. Vestibulum aliquam ligula quis felis imperdiet luctus. Phasellus efficitur gravida elementum. Sed quis mi tortor.
Pellentesque luctus porttitor est ac tristique. Nulla facilisi. Duis eu tellus ac lectus vehicula tristique. Quisque magna ex, tristique at sollicitudin sed, blandit consequat erat. In hac habitasse platea dictumst. Mauris sodales, enim in scelerisque ullamcorper, leo lectus pharetra justo, eget dignissim eros libero vitae sapien. Donec elementum varius feugiat. Donec porta eu tellus non suscipit. Integer eu diam ultricies, sodales dolor a, ornare odio. Nulla congue commodo libero, facilisis aliquam nulla pellentesque nec. Aliquam et nisi facilisis, mollis est eu, ultricies metus. Praesent rutrum eros eu neque dapibus gravida. Nam et tortor congue, egestas leo et, euismod erat. Pellentesque ut efficitur risus. Integer sodales convallis arcu, eget mattis purus condimentum eu. Mauris urna neque, ornare in convallis eget, viverra varius lectus.
Sed dapibus nibh neque, eget consequat odio placerat ac. Duis vel nunc erat. Suspendisse vel ornare leo. Sed ut augue turpis. Maecenas ullamcorper a est non pretium. Nulla venenatis interdum pretium. Nulla ut velit vel magna blandit lacinia. Etiam dictum vestibulum nulla non gravida. Pellentesque cursus enim euismod massa congue, vitae ullamcorper urna bibendum. Phasellus in tempus ex. Etiam quis ante a erat bibendum auctor.

1
sh/tests/custom-ls/folder1/asd

@ -1 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eget nisl leo. Donec gravida tristique velit sit amet vulputate. In bibendum nisi tortor. Cras ullamcorper velit non mauris dapibus blandit. Maecenas rutrum semper mauris sed hendrerit. Morbi pellentesque est at enim suscipit semper. Donec tincidunt sem velit, sit amet cursus quam tincidunt eu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus non libero vel est posuere ullamcorper sit amet nec lectus. Quisque sagittis augue euismod nulla ultricies elementum sit amet eu leo.

199
sh/tests/custom-ls/folder1/hello

@ -1,199 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce accumsan nisi vel mi sodales varius. Morbi in maximus ipsum. Maecenas pulvinar mi efficitur nulla luctus, quis tempus neque finibus. Curabitur ut tristique lacus. Donec a arcu vel mi hendrerit fermentum vitae ut urna. Nulla dapibus lacus in tellus tincidunt aliquam. Nullam tortor lorem, posuere sed nibh sed, fringilla mollis justo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec ultricies ac magna sed hendrerit. Donec nec venenatis sapien. Vivamus maximus diam at lorem interdum ullamcorper at eu mauris. Pellentesque ante tortor, sagittis in euismod non, mollis at arcu. Vestibulum vitae eleifend nisl, cursus accumsan felis. Integer a rhoncus sem, at aliquam lectus.
Vivamus molestie hendrerit efficitur. Vestibulum ut hendrerit mi, sed semper arcu. Suspendisse ullamcorper lobortis ante a tristique. Curabitur a placerat erat. Phasellus dapibus vitae ante vitae sollicitudin. Cras porta sit amet ante sed viverra. Curabitur ut elit tincidunt, facilisis ligula id, condimentum erat. Integer sit amet congue elit.
Praesent laoreet suscipit libero finibus convallis. Integer dapibus, sapien ut porta mollis, tortor sapien pellentesque ligula, at consequat mi metus sed nisi. Nulla lacinia nisi vel velit gravida, eu gravida metus faucibus. Phasellus blandit cursus metus quis volutpat. Pellentesque tempus aliquet lorem id varius. Phasellus placerat iaculis porta. Nulla nunc libero, lacinia sit amet odio pretium, malesuada molestie dui. In hac habitasse platea dictumst. Nulla congue consectetur nulla, vitae euismod urna. Aliquam massa risus, elementum ut fringilla mollis, elementum ut neque. Donec odio justo, tempor sit amet commodo nec, malesuada ultricies magna. Vivamus congue ullamcorper velit, nec pulvinar nisi fermentum eu. Morbi sit amet mi egestas, pulvinar augue ut, euismod leo. Ut auctor condimentum elementum.
Sed rhoncus facilisis sem, a congue ex congue ac. Sed dictum est lorem, eget fermentum enim molestie ut. Aenean sed sagittis nunc, in dapibus justo. Sed faucibus hendrerit felis. Duis aliquam tempor erat at porta. Morbi bibendum bibendum risus, non mattis nisl venenatis quis. Aliquam erat volutpat. Nunc ac neque arcu. Vivamus et ipsum maximus, porttitor ante in, pretium mauris. Suspendisse molestie tempus ante ut interdum. Nulla sed ex vehicula nisl fermentum viverra eget a sapien. Aliquam tempus scelerisque dignissim.
Pellentesque massa lorem, rutrum a lorem et, vehicula fermentum orci. Mauris quis viverra eros. Donec lobortis iaculis justo non sollicitudin. Nullam scelerisque volutpat ultrices. Etiam fermentum congue tortor nec molestie. Sed laoreet nisi nec aliquam condimentum. Sed hendrerit tempor lobortis. Sed tempor magna at euismod semper. Donec nec felis orci. Donec sollicitudin placerat lorem, quis semper elit mollis ac. Morbi semper eu odio ac gravida.
Aliquam sollicitudin nisi nec nibh hendrerit fermentum. Quisque laoreet, enim sit amet finibus lobortis, nulla nibh laoreet leo, quis elementum nulla nulla in dolor. Sed id porta enim. Donec eu porttitor purus. Nunc ac augue sagittis, pretium sapien ut, aliquam purus. Curabitur lacus velit, hendrerit nec sagittis sit amet, vulputate sit amet magna. Sed ut molestie magna, sit amet dapibus felis. Proin aliquet nec neque vel molestie. Mauris dictum risus nec tincidunt maximus. Proin sagittis nisi lorem, vel vestibulum purus tincidunt id. Donec pharetra nisi lacus, quis ornare odio vestibulum non. Nunc ut condimentum purus, eget porta libero. In urna nulla, aliquam nec hendrerit a, sodales vel purus.
Suspendisse non semper enim. Nunc varius est ac arcu cursus, accumsan varius lorem porttitor. Morbi viverra diam tortor, ut sodales eros aliquam id. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec blandit sit amet metus sit amet cursus. In faucibus sapien ut dolor blandit, a sollicitudin urna viverra. Vivamus posuere tellus ac elit lobortis, vel dignissim felis sodales. Aliquam ut arcu ligula. Proin nec magna semper, condimentum sem at, fermentum est. Morbi sit amet suscipit lectus. Nam porttitor libero ipsum, in sagittis est efficitur sagittis. Quisque eleifend neque id eros dapibus commodo. Nam in diam vel felis bibendum cursus non ac quam. Sed id sapien mollis, ultricies nisi sed, maximus sapien. Nulla ullamcorper at ante et gravida. Duis quis tortor libero.
Cras vitae mi eget metus scelerisque malesuada. Nulla tempor ipsum enim. Phasellus congue, eros nec dictum dignissim, elit lacus bibendum augue, et pharetra lacus nisi vitae arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer condimentum lacinia nulla in pretium. Vestibulum ipsum ante, rhoncus vitae quam id, faucibus porttitor odio. Donec vulputate, nunc vel bibendum faucibus, mauris metus rutrum lacus, eget pretium ex lacus eu ante. Duis nec nulla cursus, lacinia ipsum ut, placerat nulla. Nulla facilisi. Praesent efficitur nunc a odio pretium fringilla. Nullam viverra ornare mi a feugiat. Proin at posuere orci. Nulla placerat turpis at sem aliquet consequat. Pellentesque in velit id turpis aliquet tempor.
Fusce ullamcorper ultrices mauris, vitae convallis purus consectetur in. Mauris ac nibh arcu. Pellentesque blandit rutrum pretium. Quisque auctor ipsum blandit ante scelerisque, nec hendrerit enim eleifend. Aliquam eros enim, finibus vitae semper a, lobortis ut lorem. Maecenas eget nunc rutrum, vulputate arcu a, suscipit felis. Proin ac nisi neque. Phasellus placerat vestibulum tortor sed tincidunt. Praesent suscipit felis nec purus molestie bibendum. Aenean ornare tincidunt eros fermentum lobortis. Nunc quis augue in ante sodales consectetur id a nisi.
Etiam elit mi, iaculis id urna et, blandit euismod lectus. Proin pharetra, massa vel cursus placerat, dui sapien ullamcorper felis, sed placerat enim risus in neque. Ut metus tellus, bibendum condimentum urna ut, egestas malesuada mauris. Maecenas vel efficitur lacus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vestibulum dictum a quam quis consequat. Sed nec libero iaculis, mollis enim non, commodo libero. Nunc laoreet interdum purus at tincidunt. Proin rutrum diam ex, nec fringilla ante consequat id. Suspendisse potenti. Vivamus in justo libero. Sed sodales iaculis tellus et ornare. Fusce fermentum interdum libero ut pharetra. Sed eget venenatis mauris.
Suspendisse commodo posuere augue, vitae rutrum massa fermentum vel. Nunc dignissim lobortis convallis. Nam hendrerit egestas aliquam. Ut efficitur sem vitae libero iaculis condimentum. Nam ac dui et ante posuere interdum pulvinar ut ipsum. Integer dictum, tortor in blandit vestibulum, tortor quam mollis diam, et dictum felis tellus quis felis. Mauris sed ex aliquet, sollicitudin enim quis, semper enim. Nam feugiat ut diam ut pulvinar.
Cras eleifend sollicitudin mi vitae molestie. Vivamus facilisis maximus nulla, et vehicula dui sagittis at. Mauris eget augue orci. Sed vitae magna et velit elementum blandit. Curabitur aliquet rutrum mi, finibus aliquet eros egestas a. Ut vestibulum, purus vel lobortis tempus, odio neque lobortis enim, quis pellentesque neque justo eget velit. Aliquam erat volutpat. Aenean vel cursus turpis. Integer vel justo eu nunc dignissim aliquam. Nam vitae diam id lorem interdum vehicula. Donec ut erat molestie sem lacinia efficitur.
Duis vestibulum, ipsum vitae blandit ullamcorper, erat ex sagittis elit, ut elementum dui metus non velit. Praesent semper magna non magna vestibulum, et tempus tortor mattis. Nam ut risus bibendum, consequat mi non, congue arcu. Duis aliquam facilisis massa, et aliquet massa gravida a. Donec et ex orci. Cras mollis mi elit, nec auctor justo semper ut. Curabitur euismod interdum erat. Ut egestas turpis vel magna dictum sagittis. Quisque eu scelerisque ante, pellentesque gravida orci. Vivamus in fermentum ipsum. Vestibulum eu commodo sem. Suspendisse in lectus vel massa tincidunt pharetra sed eget eros. Sed sollicitudin egestas nisl. Aliquam consequat erat in imperdiet pharetra. Vestibulum fermentum dolor tortor, id faucibus lacus blandit mattis. Sed laoreet leo vitae lacinia pretium.
In non lorem sem. Aliquam in finibus ipsum. Nunc et interdum elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin posuere bibendum turpis, mattis dignissim dolor convallis vel. Maecenas ac erat quis magna mattis consectetur interdum ornare risus. Curabitur quis neque mauris.
Cras vitae mollis nibh, malesuada vehicula velit. Pellentesque euismod, lacus sed sodales mattis, ipsum ex egestas mauris, non sagittis elit dui nec sem. In vitae fermentum erat. Pellentesque velit diam, pellentesque sit amet dolor ac, dictum vestibulum felis. Nulla hendrerit ex vitae molestie semper. Nam vestibulum accumsan odio, sit amet suscipit ex lacinia a. Quisque rutrum dignissim nunc, ut vehicula nulla scelerisque vel. Integer sollicitudin tempus nibh in vestibulum. Donec non posuere leo. Pellentesque malesuada ullamcorper vulputate. Nam iaculis lectus vel feugiat dictum. In pellentesque purus lorem, ut auctor urna vestibulum sed. Nulla facilisi. In id metus vitae ligula sollicitudin dignissim. Ut commodo vehicula odio, at aliquam arcu volutpat id.
Nunc sed risus molestie, tincidunt tortor ac, ornare mauris. Maecenas vel nisi ac sem malesuada volutpat. Suspendisse finibus, elit in semper sagittis, sapien nisi bibendum nisi, non porta est nulla at eros. Phasellus tristique ex lectus, et aliquet ante vehicula vitae. Duis a tempus enim, vel porttitor velit. Aliquam lacinia augue nec justo ultricies pharetra. Fusce eros dolor, suscipit ut sapien sit amet, sodales vestibulum mauris. Aenean eget sem justo. Quisque consectetur tempor nibh a pellentesque. Nulla fermentum nibh ac tristique mollis.
Sed eget arcu ac purus consequat tincidunt. Fusce auctor rhoncus magna eget bibendum. Cras tempor imperdiet lacus id vehicula. Pellentesque ornare augue nec eros dictum, at ultrices justo suscipit. Aliquam consequat, ex sit amet gravida ultrices, arcu odio finibus tellus, vitae iaculis purus est a est. Fusce vulputate nisi at neque facilisis rutrum. Curabitur sed consectetur sapien, et dapibus mi.
Nunc arcu lorem, pharetra quis mattis non, iaculis vel magna. Phasellus consectetur elit nec iaculis pellentesque. Phasellus lobortis ex ex, sed imperdiet ante posuere a. Phasellus volutpat dui ut orci placerat, id laoreet libero sagittis. Nulla dignissim accumsan arcu, a pellentesque mauris ultricies ut. Ut in metus dolor. Vivamus blandit odio urna, sed euismod ex scelerisque elementum. Nunc lobortis efficitur nunc eget suscipit. Nunc at nisi diam. Fusce blandit, est a condimentum placerat, elit nisl malesuada tellus, sit amet aliquet quam enim sed eros. Morbi eget placerat lorem. Nunc ultrices odio nisl, suscipit porttitor est congue eu. Nunc rhoncus risus eleifend, ultrices nisi nec, laoreet felis.
Phasellus consectetur odio id pellentesque sollicitudin. Pellentesque volutpat sem quis malesuada pretium. Vestibulum a felis sit amet nulla lobortis efficitur consectetur at justo. Sed ut arcu vitae nibh eleifend pulvinar nec vulputate est. Donec pretium, elit sed commodo commodo, metus elit volutpat tortor, eleifend bibendum metus augue vel elit. Fusce placerat justo luctus purus condimentum sollicitudin. Donec magna erat, vehicula eget lectus a, dapibus fringilla enim. Donec varius felis at libero ultricies tempus. Donec ligula lacus, fringilla non metus sed, pellentesque malesuada eros. Aliquam vel libero vitae turpis gravida condimentum sed tristique nunc. Maecenas aliquam urna nec dolor vulputate congue. Morbi mattis purus quis nisi dictum, eu ultricies risus euismod. Pellentesque mi velit, imperdiet a cursus nec, consequat ac dui. Suspendisse ullamcorper elit quis turpis porta, non blandit dui auctor. Nullam et diam facilisis, consequat augue pulvinar, molestie orci.
Etiam ac scelerisque nulla. Cras at justo vel enim lacinia sagittis sit amet nec tellus. Nunc convallis commodo pretium. Maecenas condimentum nulla suscipit, commodo neque sit amet, fermentum enim. Curabitur dui diam, gravida in tellus vitae, luctus feugiat nibh. Vestibulum in aliquam tellus. Nunc tempus odio vel lectus vehicula, sit amet lobortis libero condimentum.
Nam dictum, erat at hendrerit tincidunt, nulla lectus convallis sem, a pretium lectus nunc non nulla. Nulla gravida vulputate justo, eu viverra felis laoreet vel. Suspendisse arcu eros, rutrum sit amet molestie vitae, cursus sed lorem. Fusce orci metus, aliquam vel ex sed, rhoncus commodo augue. Donec a eros a nibh feugiat blandit. Proin venenatis pretium pretium. Praesent nec arcu leo. Fusce lacus turpis, porttitor vitae commodo id, hendrerit eget sem. Etiam cursus tincidunt eros ut venenatis. Vestibulum ultricies consectetur leo, eu imperdiet leo ultricies quis. Donec in enim sit amet mi imperdiet dignissim. In egestas interdum risus, sit amet egestas orci lobortis eu. Cras cursus euismod nisi sit amet euismod. Curabitur malesuada venenatis sem ac maximus. Donec mattis viverra euismod. Curabitur aliquet enim tempus dapibus porttitor.
Nulla sit amet volutpat enim. Nam gravida mauris erat, at sagittis odio iaculis quis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse dapibus id velit ac viverra. Nullam diam massa, condimentum in velit at, eleifend finibus nisi. Aliquam ut tellus non massa semper blandit. Maecenas condimentum venenatis sagittis. Sed quis ante a orci mollis dictum. Etiam interdum tempus purus at aliquam. Vestibulum cursus pulvinar est vitae lacinia. Quisque nibh risus, cursus id scelerisque vitae, elementum quis diam. Aliquam pharetra massa a ex ultrices maximus. Morbi laoreet iaculis leo, vitae maximus odio.
Fusce volutpat, lacus non porttitor venenatis, nulla enim consectetur lorem, vel fermentum leo tellus non ex. Quisque pellentesque magna nec nibh blandit tincidunt. Nulla facilisi. Etiam at vulputate metus. Etiam posuere imperdiet urna, non dictum dui finibus laoreet. Vivamus vitae fringilla velit. Suspendisse tortor odio, malesuada eget nibh in, lacinia placerat felis. Fusce id lobortis ipsum, eu posuere erat. Donec vel justo erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris molestie gravida tellus, vel suscipit neque accumsan sed. Duis ac felis in mi venenatis rutrum non ac massa. Vivamus orci velit, efficitur non arcu quis, cursus gravida quam. Curabitur elementum felis luctus lobortis laoreet.
Donec pellentesque, lorem a imperdiet faucibus, leo lectus porttitor nulla, eget consequat neque ex ut est. Aenean massa tortor, iaculis id libero in, gravida sagittis justo. Duis sit amet placerat sapien, vel dictum quam. Proin maximus quam libero, a dictum mi tincidunt ultrices. Duis lobortis nisi tempor mauris egestas, in condimentum augue rutrum. Vivamus eget libero eu lorem malesuada tincidunt eu vitae nunc. Nam justo diam, eleifend id enim sit amet, eleifend facilisis purus. Phasellus convallis quam vitae augue auctor pretium. Vivamus et tristique arcu. Maecenas et urna porta, varius dui a, scelerisque mi. Fusce eget ex aliquam, commodo augue sed, ornare lacus. Quisque congue dapibus nisl.
Morbi pretium ac arcu nec accumsan. Nullam non cursus neque. Etiam eget mauris congue, faucibus felis sed, bibendum sapien. In efficitur ipsum eget bibendum pharetra. Aliquam gravida, leo ac dapibus feugiat, turpis ante ornare dui, sit amet consequat metus nunc sed nibh. Morbi pellentesque magna a justo vulputate, sed convallis turpis volutpat. Nulla accumsan odio sed nibh vulputate vulputate in quis tellus. Ut quis dolor cursus, accumsan tellus sed, condimentum mauris. Nam ullamcorper nulla in pellentesque aliquet.
Morbi vulputate finibus odio vitae vulputate. Quisque et imperdiet magna. Suspendisse sem nunc, pulvinar ac cursus sed, finibus vitae est. Suspendisse convallis, erat ornare tincidunt eleifend, turpis orci dapibus dolor, vitae mattis massa lectus ac lacus. Nunc id sem tincidunt, dapibus enim eget, tristique ex. In eu dictum enim. Curabitur ut efficitur enim. Integer ac eros mi. Pellentesque tempus hendrerit nunc, quis placerat quam lobortis at. Ut euismod ornare urna efficitur rhoncus. Duis in lorem enim.
In hac habitasse platea dictumst. Curabitur tincidunt sollicitudin lacus, id interdum velit auctor at. Proin eget risus est. Nunc enim mi, vestibulum ac risus sit amet, tristique rutrum tortor. Fusce quis nulla mattis, fermentum dolor in, semper nulla. Pellentesque vel lectus magna. Nam eget arcu suscipit, varius justo a, ornare quam. Donec vitae sollicitudin nibh, eget iaculis felis. Nullam commodo purus et magna finibus, vitae finibus ipsum aliquam. Vestibulum condimentum dui dolor, ut dictum mi maximus eu. Nunc et pretium sem. Etiam accumsan eu felis in convallis. Nullam pulvinar vestibulum tellus nec rutrum. Suspendisse semper, velit vitae vulputate posuere, nunc dolor egestas neque, at efficitur turpis metus nec leo. Etiam bibendum massa condimentum iaculis vestibulum. Morbi ipsum purus, efficitur eget maximus ac, mattis id massa.
Nam volutpat velit sed nulla ullamcorper facilisis. Sed commodo non turpis sed imperdiet. Pellentesque malesuada nibh eget commodo accumsan. Curabitur iaculis eget sapien ac aliquam. Etiam sed ex lectus. Vivamus et urna erat. Nunc quis efficitur felis. Nulla sagittis lacus a ex tristique, vehicula vulputate enim suscipit. Pellentesque pulvinar vitae leo pellentesque gravida. Sed efficitur pretium interdum. Aenean non rutrum ligula. Etiam ultrices nisl nec tempor efficitur.
Nulla eget nulla dictum, elementum lacus vitae, congue tellus. Proin sit amet pellentesque mauris, sit amet aliquet dolor. Etiam eget nulla ligula. Vestibulum imperdiet pretium mauris, ac tempus erat eleifend at. Ut condimentum fringilla ex ut faucibus. Cras eros nunc, iaculis et maximus vitae, auctor sed sapien. Fusce eu odio non ipsum posuere sagittis. Praesent nunc arcu, vestibulum ut condimentum eu, aliquam eu orci. Fusce in arcu ultricies, dictum enim consequat, facilisis turpis. Pellentesque nunc nisi, ultrices et leo et, consequat tincidunt lorem.
Pellentesque sed faucibus ex. Suspendisse ultrices vulputate dolor. Nam eu dolor suscipit, vehicula sapien non, tempus orci. Quisque eget porta nisi, id tincidunt tellus. Fusce sodales purus et ligula consequat, quis sodales metus tempor. Sed dictum libero placerat nibh tincidunt, eget aliquam orci feugiat. Suspendisse ullamcorper sapien quis porttitor sagittis. Integer vel laoreet elit. Mauris convallis viverra sapien eget accumsan. In hac habitasse platea dictumst. Sed et arcu nibh. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Curabitur quis dictum tortor, at imperdiet lorem.
Sed pulvinar nisi eu ante condimentum rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed malesuada mauris nec dui rhoncus lacinia. Curabitur tincidunt ullamcorper felis ac ullamcorper. Suspendisse dolor est, suscipit ac ligula a, molestie dapibus lectus. Morbi semper, tortor nec tincidunt elementum, nisl tortor consectetur massa, in sodales urna leo sit amet justo. Fusce eu sem eget diam blandit venenatis vel in odio. Vivamus volutpat feugiat sem, sit amet pellentesque orci molestie sed. Proin tincidunt hendrerit nibh, in blandit lacus. Maecenas mattis finibus odio, nec scelerisque ligula aliquam id. Quisque viverra velit eget sem suscipit dapibus. Integer pretium, turpis non commodo condimentum, est felis gravida arcu, vitae elementum lorem erat sed sapien.
Mauris sed urna eu lacus sagittis rhoncus. Sed eleifend id erat quis vestibulum. Suspendisse mattis tempor neque, in vestibulum nisl molestie sit amet. Nulla blandit lectus semper dui accumsan molestie. Ut in dui non augue laoreet imperdiet vitae a orci. Quisque a leo hendrerit, ultrices sem vel, rhoncus augue. Donec quis facilisis enim, ut efficitur enim. Donec finibus libero vitae sem fringilla, at pharetra arcu volutpat. Duis ut mollis dolor. Vestibulum maximus justo nisi, id euismod risus sodales vel.
Sed ut interdum quam, quis mollis lorem. Quisque eget arcu nec justo porta malesuada quis sed odio. Proin tempus enim ac neque efficitur sollicitudin. Fusce a venenatis dui, eget tincidunt sapien. Aliquam sodales hendrerit turpis sit amet commodo. Donec id dui in enim dignissim dignissim a ut lacus. Donec varius bibendum urna sollicitudin aliquet. In hac habitasse platea dictumst.
Donec suscipit cursus porta. Integer interdum ante eget suscipit egestas. Donec ultricies dignissim lectus, a aliquet diam auctor nec. Curabitur sapien turpis, facilisis eleifend metus id, euismod ultricies leo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus rutrum nisi vel leo vulputate dapibus. Fusce sit amet massa sed velit fermentum maximus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer ante ligula, sollicitudin sit amet facilisis quis, consequat id ex. Sed imperdiet venenatis tellus, vel gravida metus tempor molestie. Phasellus eleifend, neque eu fringilla fermentum, diam odio luctus lacus, ullamcorper viverra urna elit euismod metus.
Vestibulum sed arcu purus. Quisque sed tellus mattis, convallis ipsum eget, finibus turpis. Nulla quis accumsan sapien. Nam risus felis, finibus at sapien ac, commodo pharetra turpis. Vestibulum vel arcu dictum, gravida purus in, volutpat nisi. Vivamus risus felis, faucibus et erat in, tristique mollis nisi. Morbi sollicitudin ipsum vel diam placerat vestibulum. Morbi dictum velit et posuere tincidunt. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque risus eu hendrerit pharetra.
Fusce accumsan tempor est, nec fermentum augue posuere et. Etiam aliquam ullamcorper tortor iaculis condimentum. Aenean vel ullamcorper leo. Quisque consequat sit amet sapien id sodales. Vestibulum pretium dui a eros mollis volutpat. Quisque ac sodales felis. In hac habitasse platea dictumst.
Nullam placerat vestibulum ex sed porta. Pellentesque vel est iaculis, pretium neque eu, condimentum elit. Mauris vitae congue sem. Praesent molestie commodo orci a viverra. Donec consectetur tempus imperdiet. Aenean sed elit at turpis consequat ultricies. Curabitur consequat a orci sit amet feugiat. Donec fringilla, risus sed lobortis efficitur, arcu arcu elementum lorem, eu pulvinar elit eros at massa.
Mauris nec molestie turpis. Sed porttitor, orci vel rutrum accumsan, risus arcu pellentesque ante, a pretium libero sem sed lectus. Quisque ornare ipsum id libero sagittis scelerisque in nec lorem. Nunc sagittis eros diam, in elementum enim mattis vel. Duis rhoncus volutpat aliquam. Mauris hendrerit ex aliquam faucibus vestibulum. In viverra lobortis magna. Nullam tincidunt nunc id neque efficitur, et commodo dolor bibendum.
Duis fermentum massa vitae nisi accumsan, et volutpat libero porttitor. Quisque a nibh et mauris lobortis pharetra nec ac diam. Donec ultricies, tellus nec feugiat porta, felis quam accumsan ipsum, vitae laoreet sapien sem id ligula. Mauris vel erat at sapien consectetur dignissim. Aenean placerat tellus in leo fringilla, non condimentum magna placerat. Ut at justo maximus, tristique quam id, euismod orci. Morbi eget metus erat. Donec ultrices odio eget velit accumsan, vitae blandit leo dignissim. Vivamus quis auctor ipsum. Etiam placerat auctor rhoncus. Curabitur lacus justo, rutrum vitae placerat in, hendrerit ultricies augue. Integer vestibulum bibendum magna vehicula hendrerit. Nulla vehicula leo ut est feugiat imperdiet et id lorem. Maecenas quis lacus lobortis, viverra dui et, dapibus eros.
Fusce ac sapien ut odio blandit pellentesque vitae nec mauris. Aliquam a ipsum id urna condimentum dictum. Proin vehicula bibendum ligula vitae consectetur. Nullam id erat mattis, vehicula velit eu, finibus nisl. Fusce lorem neque, vehicula sed diam non, viverra venenatis ligula. Fusce fermentum turpis at volutpat mollis. Praesent nec lobortis ligula. Nulla magna nulla, consectetur vitae tincidunt ut, eleifend eu nulla. Pellentesque mollis erat et interdum vulputate.
Sed tincidunt pretium dui, et pellentesque ex interdum vitae. Mauris non pretium lectus. Etiam in aliquam dui, nec porttitor turpis. Quisque sagittis, tellus in tincidunt pellentesque, arcu urna fringilla sem, a dictum libero metus ac enim. Mauris mollis nibh quis dui finibus, eu porta arcu efficitur. Vivamus neque ipsum, vulputate a efficitur ut, laoreet eu dui. Sed in nisl mattis, tincidunt orci nec, finibus dui. Donec lobortis vitae nibh eget lobortis. Integer at fringilla dui, consectetur fringilla libero. Pellentesque magna augue, dignissim non sodales nec, convallis quis tellus. Proin tristique, mi et malesuada bibendum, tortor diam consequat felis, et rhoncus quam ante a tellus. Aenean gravida, justo eu fermentum ultricies, elit turpis vehicula felis, nec viverra lorem velit id lorem.
Aenean luctus scelerisque odio at mattis. Suspendisse sit amet malesuada leo. Nunc nec condimentum enim. Maecenas finibus massa diam. Morbi blandit scelerisque enim, id lobortis odio pellentesque in. In quis mi dui. In dignissim, leo et aliquam placerat, erat urna placerat purus, venenatis convallis ligula nibh euismod urna. Ut interdum eget turpis vel tincidunt. Nulla facilisi. Integer scelerisque augue nunc, nec pharetra purus volutpat id. Aliquam bibendum ac enim et tempor. Vivamus sit amet nisi vel lacus tristique euismod at eu eros. Fusce sed nisi ipsum. Aenean felis magna, condimentum non sapien in, pharetra maximus dui. Sed neque felis, sodales sed nisi sollicitudin, congue congue nulla.
Mauris consectetur dolor ac leo luctus venenatis. Proin blandit commodo lacus sed mollis. Nam vel est at justo laoreet finibus vitae vel turpis. Donec at augue libero. Sed accumsan justo sed est tempus blandit. Cras eros diam, pellentesque fermentum tempor in, malesuada non velit. Cras volutpat ante diam. Vivamus luctus tempus nisi, sit amet elementum massa tincidunt vitae. Suspendisse hendrerit, tortor sit amet venenatis interdum, tortor neque dictum nibh, sit amet interdum dui lacus quis lectus. Sed nisi sem, rhoncus sed aliquet sed, finibus et ante. Nulla blandit orci eu nibh ullamcorper porta. Praesent id magna id neque cursus facilisis.
Proin convallis, ligula eu fringilla tempus, risus felis sagittis quam, in tempor nisi magna ac risus. Sed imperdiet accumsan magna. Mauris maximus diam eget tincidunt luctus. Duis libero risus, molestie vitae orci consectetur, elementum tristique nisl. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Duis quis diam nunc. Praesent iaculis lacus ut diam tristique consectetur. Vivamus dui ante, mattis eget eros a, tincidunt lacinia risus. Ut ultrices porttitor odio, ac scelerisque enim efficitur id. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam vehicula accumsan erat, id mollis nisl accumsan eu. Nunc ipsum sapien, egestas et sem congue, consequat consectetur nunc. Vivamus pretium est ipsum, eget condimentum est bibendum sed. Donec lobortis blandit est, sit amet consectetur arcu. Vivamus sapien est, convallis sed laoreet eget, ornare eget tellus.
Sed condimentum, magna gravida dignissim hendrerit, nisl nunc vehicula justo, ut vehicula ipsum purus non dolor. Curabitur quis tellus porttitor, venenatis tortor eu, interdum justo. Suspendisse bibendum orci sit amet malesuada tincidunt. Sed maximus feugiat tempus. Nullam in ante ante. Nullam convallis arcu quis sapien facilisis, id dignissim sapien malesuada. Cras tempor, enim in consequat vestibulum, dui nisi maximus nulla, et dignissim justo odio non orci.
Suspendisse fringilla turpis sed tortor efficitur, a placerat nisi vestibulum. Etiam convallis lacus vitae dignissim tempor. Suspendisse id mauris a risus bibendum maximus. Nullam dignissim sit amet ligula ac lobortis. Nullam feugiat est quis tortor fermentum lobortis eget eget libero. Donec non suscipit nulla. Sed ac lacus neque. Nunc imperdiet mi ut metus sagittis mollis. Sed varius sodales accumsan. Donec auctor elementum sagittis. Donec odio mauris, faucibus quis mollis nec, efficitur at eros. Maecenas massa ligula, fringilla eget mi quis, placerat vehicula lacus. Maecenas leo nibh, bibendum ac sem sed, dignissim iaculis nibh.
Donec in tincidunt arcu. Quisque commodo rutrum ornare. Aenean eu purus pretium, faucibus justo eget, pharetra urna. Fusce pharetra facilisis sapien sed luctus. Cras non elit vestibulum, rutrum lectus ut, bibendum erat. Duis vitae est eu libero vehicula viverra at vitae ipsum. Nunc justo ligula, tempor vitae ex sit amet, consectetur placerat ex. Aenean ligula dui, fermentum vel semper sed, semper eu orci. Etiam gravida sagittis eros, et pellentesque justo. Curabitur et pulvinar velit. In semper odio leo, ut pharetra nunc accumsan nec. Sed velit augue, ultrices in ante blandit, feugiat pretium massa. Maecenas bibendum, nibh eget suscipit ultrices, elit felis auctor risus, nec dictum nibh neque ac diam. Sed consequat arcu id nibh tristique sodales. Phasellus vulputate placerat velit sed condimentum.
Nulla facilisis leo nec efficitur venenatis. Phasellus ac interdum ligula. Curabitur pharetra laoreet ipsum, ac porta nunc tristique eu. Morbi mollis varius massa ac egestas. Vivamus sed nibh tellus. Pellentesque auctor sapien aliquet nunc semper venenatis. Aenean dignissim venenatis feugiat.
Donec ut tincidunt sapien, ut consequat felis. Morbi luctus orci in elit luctus blandit. Proin fringilla odio vel elit tristique tincidunt. Integer tellus metus, vestibulum eu eleifend eu, finibus id velit. Curabitur nec turpis accumsan, aliquam nibh nec, luctus velit. Curabitur id velit eget quam scelerisque pretium et a mauris. Suspendisse vel felis lectus. Maecenas a augue lectus. Sed viverra maximus nisl, at tempor lectus ornare ut. Donec ac semper velit. Nunc hendrerit sapien et tellus fermentum sagittis.
Sed malesuada enim et est tincidunt, a tristique mi porttitor. Sed interdum, orci non sagittis sagittis, ipsum enim aliquet erat, quis pharetra sapien lacus vel tellus. Nunc dictum nunc sed suscipit tempus. In hac habitasse platea dictumst. Maecenas gravida vestibulum faucibus. Nam eget tempus odio. Maecenas a eleifend massa, ut efficitur odio.
Integer fermentum lacus turpis, at aliquet diam convallis non. Ut ac arcu vitae felis dapibus porttitor a sit amet orci. Suspendisse nisl libero, fringilla non posuere vel, pharetra nec nisl. Pellentesque et euismod nibh, eget ornare urna. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In viverra faucibus purus, a congue felis interdum ut. Aliquam vitae tellus sed felis mattis elementum. Fusce eleifend lorem ut ex euismod euismod. Donec ac consectetur augue. Cras posuere neque massa, sed euismod urna mattis ac. Mauris nec sollicitudin lacus. Sed eu massa et lorem viverra bibendum sed sit amet arcu. Vivamus gravida hendrerit mi, cursus iaculis nunc imperdiet a. Quisque purus mauris, viverra sit amet euismod sit amet, rutrum id nibh. Donec dignissim diam nibh, quis rhoncus nulla suscipit at. Mauris dapibus, tellus et efficitur aliquet, tellus diam vehicula enim, ac fermentum ante justo nec turpis.
Nullam sapien orci, pharetra a elit eu, interdum interdum libero. Ut eu pulvinar ipsum. Aliquam hendrerit elit arcu, vel volutpat nisl convallis id. In maximus justo sed magna euismod sagittis. Morbi fermentum ante nisi, id volutpat nisl congue a. Praesent sed efficitur turpis. Pellentesque eu turpis nec massa semper semper. Donec tincidunt ac lacus eget maximus. Quisque vel tortor eros. Nam vitae urna a mi maximus vestibulum.
Phasellus et eros lectus. Mauris luctus diam a dolor sagittis, quis lacinia odio euismod. Ut sed porttitor sem. Mauris faucibus vitae ex et malesuada. Nullam quis tincidunt diam, et lobortis ipsum. Pellentesque scelerisque metus vel luctus porttitor. Donec eu vehicula erat, ornare efficitur elit. Praesent ullamcorper est sit amet odio finibus malesuada. Nulla molestie id odio quis semper. In ultrices, massa quis consequat placerat, mi magna porttitor enim, sed blandit nulla nunc nec nunc. Duis suscipit, mauris sit amet aliquet sodales, arcu massa efficitur enim, et sollicitudin urna nisi sed mi.
Nunc tempus dolor lorem, consectetur semper dolor feugiat in. In imperdiet ullamcorper erat id accumsan. Sed at molestie sem. Phasellus sagittis consequat orci, in feugiat odio imperdiet ac. Aliquam auctor eros vulputate dolor rhoncus, ac hendrerit enim lacinia. Morbi augue orci, sollicitudin sed consequat fermentum, hendrerit sed velit. Sed a turpis aliquet, fringilla elit eu, dictum libero. Donec aliquam urna mauris, vel interdum urna congue vel. Sed ex tellus, consectetur sed imperdiet at, finibus efficitur nisl. Phasellus aliquam semper libero finibus rhoncus. Pellentesque dolor augue, porta eu urna eu, ultricies lacinia metus. Praesent cursus ante dapibus, volutpat nunc id, pharetra diam. Nam iaculis enim non faucibus dapibus. Vivamus est augue, aliquam ac ipsum eget, vestibulum commodo lorem. Proin porttitor nibh vitae est fermentum, id suscipit dolor elementum.
Praesent tempor fermentum tellus, vitae tincidunt turpis mattis a. Etiam eu magna et eros iaculis ullamcorper. Pellentesque pharetra turpis metus, nec bibendum leo fermentum et. Sed arcu nulla, gravida nec leo quis, efficitur suscipit libero. Quisque purus mi, auctor vitae quam quis, tincidunt porta sapien. Proin eu facilisis orci, at eleifend lectus. Aenean blandit viverra nulla non tempor. Duis venenatis tortor nec finibus interdum.
Duis sed tortor nulla. Donec scelerisque sem purus, id varius risus lobortis ut. Proin velit ipsum, vulputate vitae viverra ac, viverra quis ante. Maecenas eget sapien non sem volutpat elementum finibus eu nunc. Pellentesque non ex quis leo gravida malesuada quis mollis eros. Fusce mollis nunc eget risus vehicula eleifend in sed lorem. In hac habitasse platea dictumst. Nulla quis pretium nisl. Vivamus dignissim, nibh in luctus ornare, nunc risus commodo enim, et aliquet libero neque ut orci. Suspendisse sed quam eget urna viverra porta. Aenean ligula ligula, congue vel ullamcorper et, vehicula quis tortor. Sed dictum nec nulla eget sollicitudin. Aliquam molestie ligula justo, sit amet faucibus dolor ultricies eget.
Aliquam et risus posuere, malesuada nibh id, malesuada sapien. Curabitur lacus ex, ullamcorper id pharetra at, maximus vel augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec varius felis quis tortor laoreet volutpat. Quisque iaculis posuere enim, tincidunt rhoncus erat sodales vel. Etiam sit amet purus suscipit, tempus lacus non, semper tellus. Pellentesque in aliquet urna. Vivamus a justo bibendum, tristique tellus pretium, fringilla eros.
Cras eget arcu condimentum, varius eros vel, fermentum quam. Duis ut turpis ut erat laoreet pulvinar et non lectus. Nam mattis libero quis congue pharetra. In vulputate quis massa quis eleifend. Donec eu velit ac urna tempor blandit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam sed lobortis mi. Etiam porttitor, leo sed dictum rutrum, justo massa semper tortor, vel lobortis urna elit a felis. Aliquam odio augue, pellentesque sed ex sed, bibendum pellentesque turpis. Morbi viverra nulla ac ipsum mattis, non auctor tortor condimentum. Vestibulum pretium nec nulla vitae sollicitudin. Integer scelerisque libero id blandit pharetra.
Ut aliquet libero id commodo mattis. Nulla ut ex malesuada, tincidunt nisl in, lacinia nisl. Pellentesque scelerisque semper mauris, nec tincidunt urna bibendum id. Nulla facilisi. Nulla facilisi. Sed id fringilla odio. Fusce tempus egestas mauris nec accumsan. Integer dictum, elit vehicula molestie ultrices, purus sapien luctus enim, nec suscipit felis neque sit amet mi. Nulla sed fermentum orci.
Donec id lorem euismod, posuere leo in, pharetra velit. Nullam sed blandit mauris. Proin vitae congue neque, quis tristique ante. Donec consectetur a velit sed congue. Sed finibus dui luctus, maximus metus et, tempor sapien. Quisque vulputate molestie arcu eu malesuada. Ut consectetur rutrum diam eu viverra. Suspendisse interdum ipsum mattis neque pulvinar posuere. Donec dolor erat, bibendum vitae malesuada ac, hendrerit quis metus. Duis vitae urna orci. Sed lobortis nisl ut tortor eleifend malesuada. Curabitur dapibus ex vitae ante ornare, et aliquet orci bibendum.
Quisque sollicitudin metus turpis, vitae condimentum metus semper id. Duis pharetra facilisis leo vel egestas. Vivamus ut magna justo. Sed quis vehicula turpis, sed dictum augue. Praesent erat tellus, fermentum non vestibulum vitae, commodo in lectus. Integer eu rutrum nibh. Sed pellentesque lacinia mauris, et varius orci laoreet ut. Nulla condimentum ante eros, sed aliquam augue gravida nec. Integer auctor nisl nec mauris vulputate laoreet eget nec lorem. Suspendisse convallis dui a nisi dapibus egestas sit amet non quam. Cras vulputate sapien sit amet lacinia scelerisque. Quisque justo ante, tincidunt in risus ut, dapibus maximus mauris. Vivamus eget lectus nec mi eleifend viverra. Fusce efficitur turpis vel erat auctor aliquam. Nunc volutpat felis massa, sit amet egestas libero mollis non.
In in tempus sapien, sit amet lacinia lacus. Phasellus vehicula sodales cursus. Pellentesque at mollis sapien. Quisque sollicitudin, lorem nec condimentum fringilla, velit arcu vehicula dui, at porttitor turpis leo nec nunc. Mauris elementum eros purus, malesuada consectetur orci sodales eu. Fusce suscipit, turpis vel mattis finibus, leo lacus maximus nibh, ac aliquet nunc enim et lectus. Donec nec nulla est. Duis porta id dolor a vehicula. Mauris accumsan arcu eget metus scelerisque, eget consequat mi rutrum. Aenean placerat tristique feugiat.
Mauris in odio neque. In pretium libero condimentum urna fermentum cursus. Vivamus tincidunt tincidunt volutpat. Aenean sed faucibus dui, tincidunt egestas eros. Nunc velit velit, aliquam eget purus eu, dictum ullamcorper eros. Vestibulum molestie interdum pulvinar. In ac mauris non metus consectetur luctus sed in risus. Sed eget consequat augue. Nulla posuere ligula augue, eu pretium ipsum placerat a. Mauris quis ullamcorper metus, at egestas tellus.
Ut consectetur placerat mauris vel placerat. Nam volutpat sapien ut ornare congue. Vestibulum cursus magna at scelerisque venenatis. Nullam ac lacus quis sapien lobortis ullamcorper eu in libero. Quisque semper vitae urna vitae dictum. Mauris pretium elementum turpis, vel varius odio ullamcorper in. Vestibulum efficitur malesuada est, eu venenatis mauris iaculis sed. Sed suscipit egestas lacus, at porta risus cursus et. Aenean nec augue tempor est elementum bibendum vitae non nisl. Proin molestie porttitor dolor vitae laoreet. Ut sagittis, dui quis pulvinar ultrices, neque tortor auctor nibh, sed ornare mauris mauris vel lacus. Nunc sed ullamcorper lorem. Maecenas facilisis arcu non diam feugiat rhoncus.
Mauris dictum iaculis molestie. Duis viverra pellentesque volutpat. Proin id felis velit. Morbi sed tellus sed ligula molestie ultricies. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque at lobortis ex. Integer pharetra nibh diam, vehicula scelerisque mi vehicula sit amet. Proin lobortis at augue non bibendum. Morbi porttitor varius tortor, et tristique nibh cursus vitae. Maecenas cursus facilisis tortor, aliquet volutpat ante convallis eget. Nunc odio turpis, pellentesque sed enim sit amet, posuere eleifend magna. Duis ultrices felis ipsum, eu ornare ex iaculis et. Curabitur metus diam, rutrum sit amet rhoncus et, imperdiet sit amet neque. Cras nec dui laoreet magna condimentum fringilla vel quis orci. Morbi sit amet nisi luctus, commodo lacus et, aliquam felis.
Integer pharetra lacinia metus, ut gravida enim varius nec. Proin in risus augue. Aenean vel urna elit. Cras sed erat molestie enim fringilla posuere sed vel lorem. Suspendisse mauris massa, tempus quis tortor ut, placerat egestas ligula. Nam eu massa dictum, fermentum est nec, lacinia felis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque tellus quam, placerat commodo tincidunt id, tincidunt ut lectus. Integer ut blandit diam. Duis quis rutrum augue. Nulla ex elit, malesuada vel interdum in, commodo a turpis. Quisque pharetra neque at imperdiet ornare. Cras tincidunt arcu tellus, sit amet ultricies nisi congue nec. Curabitur vel est sed dolor euismod tempus. Praesent at sagittis risus, id viverra neque.
Donec augue leo, pellentesque eu volutpat quis, suscipit in mi. Aenean placerat libero id ornare vestibulum. Maecenas nec faucibus nisi. Curabitur elementum aliquam congue. Maecenas nec lobortis purus. Nam aliquam justo erat, in placerat magna rutrum suscipit. Vestibulum non sem et ipsum lobortis consectetur. Sed sed commodo dui, in feugiat ipsum. Proin mattis gravida lectus, non placerat magna fringilla sit amet.
Integer erat sem, hendrerit id venenatis quis, vestibulum in orci. Praesent sed nisl in sem euismod suscipit. Vivamus in lectus est. Nulla sed neque ut dui posuere interdum sed in mi. Maecenas tincidunt porta ornare. Quisque id sapien aliquet eros consectetur ultrices. In dui turpis, tincidunt ac consectetur vel, scelerisque id arcu. Curabitur sed auctor tellus, sit amet congue ex. Vestibulum accumsan, diam id interdum feugiat, ex turpis fermentum enim, nec tristique ante lacus in sem. Fusce vel ante luctus, mollis ante quis, porttitor leo.
Morbi luctus cursus sapien, accumsan pulvinar urna euismod id. Duis fermentum mi a sapien sollicitudin, ac laoreet magna vestibulum. Integer faucibus diam id dui lacinia, et egestas felis faucibus. Vestibulum efficitur quam at condimentum vulputate. Donec et orci mauris. Cras sit amet dictum nulla, eu vestibulum lacus. Suspendisse rhoncus nibh neque, sit amet semper leo eleifend vel. In tortor tellus, ornare a risus at, malesuada porttitor massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nam urna nunc, ultrices at nulla sit amet, cursus malesuada lacus. Integer nec sem faucibus, placerat sapien ac, placerat sapien. Cras molestie arcu imperdiet nisi accumsan luctus. In in interdum turpis. Aliquam posuere volutpat pharetra. Aenean pharetra volutpat tempor. Aenean quis turpis ut libero interdum gravida. Maecenas ac scelerisque velit. Morbi non nulla dignissim, maximus lacus sit amet, vestibulum metus. Nunc convallis elit non tincidunt ultricies. Suspendisse aliquet vel lectus a facilisis. Nulla sit amet venenatis odio.
Suspendisse magna nisi, varius luctus ipsum et, imperdiet consequat lacus. Nulla quis congue augue. Proin vehicula mi leo, suscipit dignissim ex egestas eu. Quisque interdum erat quis quam facilisis, in feugiat felis tincidunt. Donec orci odio, porttitor vitae pellentesque eu, rhoncus ac risus. Aliquam faucibus commodo orci. Sed eu arcu sed diam venenatis vulputate a ut sem. Integer nec dapibus dolor. Aenean fringilla malesuada quam, non sagittis libero venenatis ac. Integer blandit neque eget leo auctor lobortis. Donec at tincidunt nunc, a efficitur purus. Vestibulum et orci lobortis, cursus lorem dapibus, malesuada nisi. Nunc in ipsum quis ipsum malesuada lacinia eu non tortor. Mauris ac vehicula tellus.
Nullam ut aliquet ipsum, vitae porttitor sapien. Curabitur eleifend sem id venenatis elementum. Nullam non augue eu arcu posuere finibus sit amet eget lorem. Sed vehicula lectus a justo ultrices, eget pharetra augue eleifend. Pellentesque tempor turpis sed leo viverra tempus. Duis volutpat non urna sit amet dictum. Mauris eu orci pellentesque, rhoncus purus a, fermentum dui. Cras accumsan commodo euismod. In suscipit aliquet ex, a scelerisque tortor ultrices ac. Donec ipsum dui, vulputate non gravida et, vulputate ac dolor. Curabitur et hendrerit arcu, et hendrerit erat. Vivamus suscipit risus eu orci sollicitudin, vel convallis enim ultricies. Cras vehicula consequat risus ac gravida. Duis venenatis nisi vel leo pulvinar bibendum. Mauris elementum et quam eu elementum.
Aliquam erat volutpat. Sed a dapibus diam. Quisque laoreet sit amet tortor sodales interdum. Duis congue venenatis odio, suscipit dignissim justo pretium non. Nunc eu arcu ullamcorper, placerat nisl a, euismod libero. Phasellus molestie mi quis est egestas, ac venenatis justo malesuada. Fusce et nisi ullamcorper, pharetra risus non, venenatis libero. In et sodales ante. Ut quis odio at diam interdum laoreet non nec odio. Morbi rutrum metus nisl, sit amet finibus ipsum accumsan vitae. Praesent fringilla rhoncus erat id ultrices. Aenean ut erat non nisl blandit bibendum ac sit amet lectus. Pellentesque scelerisque dui nec fermentum eleifend. Nulla rhoncus magna non orci sollicitudin fermentum. Nullam consequat orci vitae ullamcorper laoreet. Nam congue tincidunt ligula condimentum ultricies.
Donec nec eros vitae ante commodo scelerisque. Donec felis ex, ornare ut neque a, volutpat blandit enim. Fusce a mi a nunc facilisis semper. Fusce mollis justo eu mi tempor eleifend. Sed ultrices urna quis ipsum cursus, et elementum ante posuere. Praesent viverra vestibulum iaculis. Praesent vel faucibus erat. Integer et diam dapibus, convallis arcu quis, pharetra nulla. Mauris enim arcu, fringilla in tincidunt non, suscipit eu erat. Etiam quis ante euismod, gravida nisl vel, tincidunt libero. Vivamus ac eleifend arcu. Mauris egestas, eros ut porttitor vehicula, erat ligula faucibus elit, ut suscipit massa augue ut est. Aliquam dapibus efficitur purus eu pretium. Donec pulvinar turpis orci. Mauris nisl velit, pharetra sed nisl at, pellentesque convallis felis. Etiam vitae lectus lectus.
Aenean eu ligula interdum, feugiat lacus quis, feugiat tortor. Etiam mattis massa vel augue ullamcorper egestas. Vivamus in orci magna. Vivamus a dictum nisl, vitae ornare justo. Sed libero tellus, dapibus in auctor et, porta vel augue. Nullam scelerisque tellus pretium nibh varius vestibulum. Sed et neque turpis. Proin malesuada nisl ut felis iaculis, ac aliquam lorem euismod. Vestibulum pretium sapien sit amet enim egestas elementum. Cras eget est luctus, mollis sapien ac, porta ex. Praesent venenatis dapibus lacus, ut efficitur lacus fringilla non. Integer eu rutrum magna. Integer iaculis venenatis blandit. Vestibulum euismod vitae leo tincidunt dignissim. Interdum et malesuada fames ac ante ipsum primis in faucibus.
Proin sodales neque dui, at sagittis magna fermentum vel. Cras id metus id sapien cursus rhoncus. In hendrerit augue dictum, gravida augue vel, consectetur lorem. Vivamus sollicitudin pellentesque pulvinar. Donec consectetur sem quis odio scelerisque elementum. Ut luctus enim nec nunc venenatis mattis vitae ac lorem. Nullam aliquam nulla et ornare interdum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam sollicitudin lacinia tellus et suscipit.
Ut eget orci non est luctus mattis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vel magna ligula. Donec eu sem ut odio ullamcorper ornare. Sed blandit, felis pellentesque laoreet cursus, diam sem viverra nunc, in auctor orci diam sit amet enim. Maecenas sit amet commodo turpis, nec tristique lectus. Maecenas dictum leo nec rhoncus faucibus. Vestibulum augue quam, varius ac facilisis vitae, commodo in quam. Aenean suscipit tellus non tincidunt viverra. Integer eu ipsum non nibh bibendum euismod id at erat.
Mauris non malesuada sapien. Pellentesque vitae mi nulla. Curabitur laoreet, sapien et facilisis varius, est est dapibus leo, dapibus auctor erat urna vel enim. In vehicula, nisl ac pharetra finibus, tellus ipsum vestibulum mi, venenatis pulvinar ante sem nec risus. Phasellus porta porttitor lectus, id consectetur justo commodo a. Donec in dui ut tellus ultricies aliquet. Praesent ac mi metus. Integer lobortis purus eu justo lobortis, vel imperdiet ex hendrerit. Aliquam erat volutpat. Proin ut ligula nisl. Sed pretium porttitor varius. Nam iaculis ac orci sed pulvinar. Donec mattis orci non dui vehicula, at lobortis nibh efficitur. Vestibulum varius erat ornare posuere convallis.
Vivamus gravida massa feugiat scelerisque maximus. Nam bibendum facilisis vehicula. Vivamus id lacinia nisl. Sed tempus, orci in tincidunt dignissim, nulla nibh fringilla magna, et rutrum erat sapien ac turpis. Curabitur laoreet id mi in luctus. Vestibulum nec erat et nunc bibendum feugiat vitae nec eros. Morbi vitae convallis neque, vitae faucibus leo. Suspendisse sem justo, vestibulum eget nulla varius, molestie vestibulum nibh. Nullam eleifend arcu enim, et porta felis pretium id. Cras eu sapien quis lacus feugiat venenatis.
Sed diam turpis, interdum vel felis imperdiet, posuere venenatis augue. Maecenas sapien nulla, consectetur vitae mattis in, finibus id lorem. Quisque consequat euismod vestibulum. Maecenas congue velit lorem, tincidunt tristique lorem consectetur quis. Proin vulputate porta convallis. Cras id tincidunt nulla. Proin sit amet turpis imperdiet turpis aliquet feugiat sit amet eu augue. Donec ut consequat neque. Morbi laoreet leo eu augue ullamcorper, ut porttitor lectus pulvinar.
Vivamus vitae nisi eu libero vestibulum sollicitudin vitae in metus. Ut nec massa justo. Phasellus euismod consequat massa id tempor. Vestibulum et imperdiet quam. In ipsum nibh, consectetur quis posuere vitae, laoreet et ante. Maecenas cursus eros vel ante tempor, vel tristique neque tincidunt. Ut eget erat vitae sapien posuere luctus. Donec a finibus erat.
Quisque at ligula sit amet arcu molestie feugiat commodo sit amet nisi. Aenean aliquet hendrerit metus vitae lacinia. Pellentesque pulvinar luctus ipsum non condimentum. In fringilla ac dui a fermentum. Nulla sollicitudin, nisl a fermentum rutrum, eros diam posuere nunc, eget luctus risus eros nec ligula. Suspendisse sit amet ante porta, semper est tempor, pulvinar odio. Cras dictum elit sed orci lacinia aliquet. Ut consectetur, nisl sit amet lacinia finibus, leo eros tempus risus, at lacinia nulla nisi vel tellus. Aliquam at nisl egestas, auctor est a, congue diam. Proin fringilla pellentesque arcu sit amet aliquet.
Morbi a lectus ultricies nibh efficitur scelerisque ac ac urna. Nunc molestie risus vitae ipsum ornare vestibulum. Vivamus molestie tincidunt tempus. Maecenas tristique luctus augue ut lobortis. In risus turpis, condimentum mattis posuere eget, sodales ut lorem. Sed vulputate tempor diam in ullamcorper. Aenean aliquet lectus vitae massa laoreet, nec vehicula odio porta.
Aliquam tristique ut nisi sit amet luctus. Quisque nulla mi, vulputate at lobortis vitae, fermentum at lacus. Curabitur non massa in nunc tempus dignissim. Suspendisse erat velit, molestie non vulputate in, lobortis quis purus. Pellentesque quis placerat nisl. In posuere vestibulum nisl eget egestas. Sed non dui posuere, pharetra est eu, ullamcorper mauris. Pellentesque dictum varius erat at condimentum. Sed nisi enim, pellentesque quis enim molestie, imperdiet volutpat arcu. Aenean commodo finibus vulputate. Fusce ornare scelerisque urna, vitae tempus neque vehicula eu.
Fusce lacinia augue id tristique rutrum. Aenean ut elementum augue. Nulla ut lectus tellus. Pellentesque et libero et mauris facilisis rutrum a pharetra dolor. Vivamus lobortis lacus eu ante suscipit, vel commodo nisi venenatis. Sed gravida gravida congue. Aliquam rutrum dictum orci ac condimentum. Aenean ac ex eu diam dapibus venenatis id ut lacus.
Maecenas non porttitor orci. Donec dapibus rhoncus consectetur. Cras porta sagittis magna, at convallis eros consequat non. Quisque consectetur sem in sagittis sollicitudin. Maecenas id eros porta, tristique sem mollis, sagittis enim. Praesent mollis dapibus commodo. Etiam bibendum lacus nec iaculis eleifend. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam vitae finibus erat. Fusce sollicitudin eleifend elit in hendrerit. Quisque fermentum rhoncus pulvinar. In lobortis libero ac nisi euismod venenatis sit amet sed ipsum. Nam id molestie quam, eu bibendum diam.
Etiam non augue volutpat, fermentum nunc non, sodales lectus. Curabitur elementum euismod ex, quis porttitor erat tempus accumsan. Morbi fringilla nisl nec hendrerit cursus. Suspendisse egestas massa in nisl gravida sollicitudin. Maecenas maximus, tortor sed lacinia consectetur, nisi magna tincidunt lorem, vel maximus dolor sem in eros. Sed a vulputate nunc. Integer egestas, tortor vitae imperdiet cursus, massa enim pellentesque felis, sit amet sollicitudin velit arcu id lorem.
Nullam nec diam convallis, fermentum quam id, pulvinar velit. Pellentesque ultricies semper metus, cursus pulvinar tortor consectetur vel. Fusce suscipit urna sem, vitae ultrices lacus aliquet vel. Pellentesque tempor tristique mi, quis rhoncus lacus fringilla a. Interdum et malesuada fames ac ante ipsum primis in faucibus. Morbi neque risus, malesuada at lacinia non, posuere elementum mauris. Pellentesque eget egestas est, nec congue leo. Nunc faucibus mi id vulputate sodales. Cras ornare eget justo eu blandit. Fusce id magna lorem. Nunc sit amet dolor placerat, ornare metus non, ultricies augue.
Ut sed auctor dui, ullamcorper pretium sapien. Sed ut felis id nunc mollis consectetur et in nunc. Nunc volutpat nec urna nec facilisis. Ut sagittis ipsum nec aliquam interdum. Donec rutrum dolor eget neque euismod vestibulum. Nulla condimentum neque neque, eget ullamcorper risus cursus scelerisque. Sed bibendum luctus dolor eget dignissim. Etiam non nulla enim. Vestibulum eget semper odio. Sed semper vulputate ipsum ac maximus. Nullam sed libero pellentesque quam rhoncus sagittis vitae sed ipsum.
Sed vitae ex vulputate, scelerisque sapien quis, mattis massa. Duis rutrum neque ante, a vestibulum massa congue at. Nam tincidunt ex luctus ultricies laoreet. Duis cursus magna eu diam malesuada ultricies. Cras porttitor sagittis tellus, eget mollis enim molestie eu. Nunc tristique semper massa. Nullam varius velit sit amet velit suscipit, a bibendum odio facilisis. Nunc et arcu bibendum, fermentum odio id, congue lectus. Phasellus malesuada volutpat justo ut sodales. Integer interdum et nibh non blandit. Nam a vulputate tellus.
Quisque auctor commodo nisl, ut semper lectus tincidunt sed. Integer cursus finibus est. Vivamus dui dui, feugiat nec leo eu, vestibulum interdum nunc. Nam massa dolor, tempor sit amet congue et, maximus at elit. In blandit at nibh et porta. Curabitur elementum efficitur elit, vel sagittis tellus eleifend lacinia. Sed tincidunt elit eu purus fermentum finibus. Aenean egestas dignissim tellus vel semper.
Nulla id condimentum lorem. Donec vitae dui quam. Maecenas sapien dui, facilisis sed tellus sit amet, pharetra iaculis ligula. Fusce sagittis, odio sed aliquam feugiat, nunc ipsum ultrices lorem, vel pellentesque nibh orci finibus leo. Proin a urna tincidunt, porttitor sapien ac, fringilla velit. Suspendisse in vehicula risus. Morbi mattis cursus cursus. Nam vel varius nisi, blandit malesuada lacus.
Nullam laoreet nibh quis erat dictum fringilla. Quisque a tortor dolor. Curabitur pulvinar molestie lectus, eget dapibus nisl tristique id. Nullam pulvinar accumsan arcu, euismod auctor nunc dignissim ac. Vivamus pulvinar massa at metus sollicitudin, dictum convallis arcu vestibulum. Suspendisse at leo nec sem sollicitudin luctus sit amet vitae nisi. Duis lobortis risus id odio luctus, sit amet feugiat mauris ullamcorper. Donec iaculis suscipit nunc eu dictum. Quisque ut lobortis elit. Cras eget auctor lacus. Donec mattis vitae nisi a porta. Morbi quis eros sed ante pharetra euismod. Nullam varius bibendum magna a cursus.
Aenean vestibulum leo magna, sit amet varius eros eleifend mollis. Aenean tempor ullamcorper velit vel sagittis. Aenean maximus enim nulla, nec pellentesque elit ullamcorper eget. Duis tincidunt, dolor id euismod rhoncus, orci dolor auctor augue, eu molestie odio tellus nec sem. Donec gravida arcu ac ex ultrices rhoncus. Nulla tincidunt gravida neque id dictum. Sed lectus lectus, rhoncus ac odio vitae, porttitor elementum nunc. Morbi gravida, leo id sollicitudin iaculis, mi elit volutpat eros, quis venenatis massa dui pharetra neque. Cras sit amet dignissim mi. Donec in lectus sed risus congue consequat. Duis ut malesuada metus. Praesent maximus ac tortor eget feugiat. Nulla in nunc eget quam sodales sagittis.
Nam eu porta enim. Fusce pretium elit sapien, a feugiat nibh tempor a. Etiam feugiat dui nec neque malesuada, quis tristique sapien vestibulum. Sed volutpat eget nulla id imperdiet. Morbi sodales tortor ac ligula vulputate tincidunt. Aliquam placerat orci sem, id fringilla orci facilisis eu. Nullam aliquet odio eget ante placerat blandit. Morbi ut justo cursus, ullamcorper purus id, scelerisque neque. Donec a nisi pellentesque, commodo magna efficitur, feugiat neque. Maecenas at quam eleifend, ornare sem non, pretium ante. Pellentesque eget fringilla ligula. Donec massa arcu, viverra auctor sem at, ultricies blandit odio. Proin sed leo quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce elementum efficitur blandit. Morbi tincidunt porttitor odio nec placerat.
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec vel libero pharetra, euismod nulla sit amet, volutpat lorem. Maecenas blandit magna ornare mi imperdiet luctus. Fusce congue risus et enim placerat ornare. Aenean ac magna eget risus rhoncus molestie at et leo. Cras mattis erat lectus, sed dignissim enim pulvinar vel. Donec turpis libero, condimentum sit amet rutrum id, blandit in diam. Praesent tincidunt malesuada lorem, at posuere nisi. Ut rutrum turpis vel mi blandit congue. Aenean viverra metus quis erat hendrerit, nec egestas diam placerat. Praesent vel ipsum enim. Praesent eget sollicitudin dui. Donec semper turpis id magna molestie, sit amet interdum odio lacinia. Curabitur ut mollis metus. Duis luctus leo velit, id accumsan risus sodales non.
Nullam ut arcu sed justo tempus consequat. Donec nisl ante, lacinia ac convallis ac, bibendum sed diam. Duis viverra dolor sed ex convallis, vel facilisis ligula maximus. Pellentesque eu pulvinar nulla. In ante risus, viverra a euismod et, laoreet a dui. In hac habitasse platea dictumst. Nunc ullamcorper tellus non viverra pharetra. Aenean dapibus dolor sit amet dui facilisis placerat. In hac habitasse platea dictumst. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec ac efficitur enim, ac placerat dui. Donec vitae vestibulum leo.
Aliquam vestibulum dictum metus, eget commodo ipsum sollicitudin et. Nam volutpat efficitur magna eu vestibulum. Donec dolor purus, aliquet quis orci ut, finibus molestie sapien. Mauris in libero in lorem pretium commodo eu sit amet justo. Integer eu elit sit amet orci cursus sagittis ac a ligula. Curabitur ac eleifend ante. Nulla placerat lacus eu molestie hendrerit.
Proin eu dignissim ante. Fusce lobortis eu ante sed finibus. Vivamus sed dictum turpis. Ut tristique vitae nibh at laoreet. Nullam eget interdum metus, sit amet porttitor nibh. Maecenas dignissim, lacus ac facilisis volutpat, ante nibh vehicula dui, nec facilisis enim turpis vel turpis. Proin risus tortor, vehicula sit amet congue eget, accumsan a magna. Suspendisse potenti. Praesent lacinia mollis feugiat. Donec a nunc ac nibh tincidunt volutpat. Proin nec urna eros. Sed vitae elit fringilla, congue sem non, mattis arcu. Maecenas euismod neque metus, consectetur vestibulum neque rutrum non.
Morbi magna metus, congue nec lacus id, semper mattis augue. Pellentesque vel dolor eu turpis luctus volutpat. Donec consectetur maximus commodo. Quisque erat elit, iaculis vel leo quis, volutpat mollis quam. Sed dui lectus, pretiu

1
sh/tests/custom-ls/folder1/ls-test

@ -1 +0,0 @@
hello

42
sh/tests/custom-ls_test.sh

@ -1,42 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
shopt -s expand_aliases
FILENAME="student/custom-ls.sh"
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
source "$script_dirS"/$FILENAME
submitted=$(cd "$1" && custom-ls)
unalias custom-ls
source "$script_dirS"/solutions/custom-ls.sh
expected=$(cd "$1" && custom-ls)
unalias custom-ls
diff <(echo "$submitted") <(echo "$expected")
}
# True if FILE exists and is a regular file
if [ -f ${FILENAME} ]; then
# FILE exists and it's not empty
if [ -s ${FILENAME} ]; then
if [[ $(cat $FILENAME | grep echo | wc -l) -ne 0 ]]; then
echo "echo is not allowed in this exercise!"
exit 1
fi
challenge custom-ls/folder1
else
echo "The file exist but is empty"
exit 1
fi
else
echo "File does not exist"
exit 1
fi

18
sh/tests/details_test.sh

@ -1,18 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
touch file1.txt
submitted=$(bash "$script_dirS"/student/details.sh && ls -l file1.txt | awk '{print $1, $2, $5, $6, $7, $8, $9}')
expected=$(bash "$script_dirS"/solutions/details.sh && ls -l file1.txt | awk '{print $1, $2, $5, $6, $7, $8, $9}')
diff <(echo "$submitted") <(echo "$expected")
stat file1.txt
}
challenge
rm file1.txt

44
sh/tests/dir-info_test.sh

@ -1,44 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
IFS='
'
FILENAME="student/dir-info.sh"
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
rm -rf student/dir-info-files
mkdir student/dir-info-files
cd student/dir-info-files
directories=(folder1 folder2/aa folder2/ba/aa folder2/aa/ba)
for dir in "${directories[@]}"; do
mkdir -p "$dir"
done
files=(.abc 34 folder1/ab 4 folder1/ac 2 folder1/az 3 folder1/bz 3 \
folder1/cz 9 folder1/.hello 21 folder1/za! 3 folder2/ab 7 folder2/ac 0 \
folder2/alphabet 0 folder2/az 0 folder2/bz 4 folder2/cz 0 folder2/za! 28 \
folder2/aa/aa 3 folder2/aa/az 4 folder2/aa/.salut 7 folder2/aa/ba/ab 0 \
folder2/aa/ba/bz 0 folder2/ba/ac 0 folder2/ba/alphabetz 0 folder2/ba/.ola 17 \
folder2/ba/aa/alphabetz! 0 folder2/ba/aa/.ciao 7 folder2/ba/aa/cz 0 \
folder2/ba/aa/za! 0)
for ((i=0; i<${#files[@]}; i+=2)) do
dd if=/dev/zero of="${files[i]}" bs=1 count="${files[i + 1]}" 2> /dev/null
done
cd ../
challenge () {
submitted=$(bash "$script_dirS"/"$FILENAME" < <(echo "$1"))
expected=$(bash "$script_dirS"/solutions/dir-info.sh < <(echo "$1"))
diff <(echo "$submitted") <(echo "$expected")
}
challenge "dir-info-files/folder1"
challenge "dir-info-files/folder2"
challenge "dir-info-files"
rm -rf dir-info-files

37
sh/tests/division_test.sh

@ -1,37 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
# Test if test command was used
if grep -q "test" "$script_dirS"/student/division.sh
then
echo "Error: the test command cannot be used in the student script"
return
fi
# Test with one or two arguments
if [ $# -eq 1 ]
then
submitted=$(bash "$script_dirS"/student/division.sh $1)
expected=$(bash "$script_dirS"/solutions/division.sh $1)
else
submitted=$(bash "$script_dirS"/student/division.sh $1 $2)
expected=$(bash "$script_dirS"/solutions/division.sh $1 $2)
fi
diff <(echo "$submitted") <(echo "$expected")
}
challenge "10" "2"
challenge "4" "2"
challenge "0.5" "0.5"
challenge "5" "2"
challenge "0.5"
challenge "foo" "bar"
challenge "1" "0"
challenge "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "2"

15
sh/tests/easy-conditions_test.sh

@ -1,15 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
for i in $(seq 1 5); do
export X=$(shuf -i 1-20 -n 1)
export Y=$(shuf -i 1-30 -n 1)
submitted=$(bash "$script_dirS"/student/easy-conditions.sh)
expected=$(bash "$script_dirS"/solutions/easy-conditions.sh)
diff <(echo "$submitted") <(echo "$expected")
done

12
sh/tests/easy-perm/example.txt

@ -1,12 +0,0 @@
Q. How did the programmer die in the shower?
A. He read the shampoo bottle instructions: Lather. Rinse. Repeat.
~~~~~~~~~~~~~~~~~~~~~~~~~
How many programmers does it take to change a light bulb?
None – It’s a hardware problem
~~~~~~~~~~~~~~~~~~~~~~~~~
Why do programmers always mix up Halloween and Christmas?
Because Oct 31 equals Dec 25.

16
sh/tests/easy-perm/example2.txt

@ -1,16 +0,0 @@
“The best TDD can do, is assure that code does what the programmer thinks it should do. That is pretty good BTW.”
“Simply put, things always had to be in a production-ready state: if you wrote it, you darn well had to be there to get it running!”
“If you think it’s expensive to hire a professional, wait until you hire an amateur.”
“Programming is not a zero-sum game. Teaching something to a fellow programmer doesn’t take it away from you.”
“A phased approach to continuous delivery is not only preferable, it’s infinitely more manageable.”
“So, what do you do?”
“I’m lean”
“What?”
“I’m agile”
“What?”
“Fine. I make websites.”

17
sh/tests/easy-perm_test.sh

@ -1,17 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
chmod 303 easy-perm/*
challenge() {
submitted=$(bash "$script_dirS"/student/easy-perm.sh && ls -l "$1" | awk '{print $1}')
expected=$(bash "$script_dirS"/solutions/easy-perm.sh && ls -l "$1" | awk '{print $1}')
diff <(echo "$submitted") <(echo "$expected")
}
challenge easy-perm/

28
sh/tests/env-format_test.sh

@ -1,28 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/env-format.sh"
# True if FILE exists and is a regular file
if [ -f ${FILENAME} ]; then
# FILE exists and it's not empty
if [ -s ${FILENAME} ]; then
if [[ $(cat $FILENAME | grep echo | wc -l) -ne 0 ]]; then
echo "echo is not allowed in this exercise!"
exit 1
fi
submitted=$(bash $FILENAME)
expected=$(bash solutions/env-format.sh)
diff <(echo "$submitted") <(echo "$expected")
else
echo "The file exist but is empty"
exit 1
fi
else
echo "File does not exist"
exit 1
fi

38
sh/tests/file-checker_test.sh

@ -1,38 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
# check that test command was not used
if grep -q "test" "$script_dirS"/student/file-checker.sh
then
echo "The 'test' command is not allowed in this exercise"
exit 1
fi
if test ! -e file-checker; then
mkdir file-checker
cd file-checker
touch readable-and-writable readable-only readable-and-executable readable-writable-executable
chmod -x "$script_dirS/file-checker/readable-and-writable"
chmod -xw "$script_dirS/file-checker/readable-only"
chmod -w "$script_dirS/file-checker/readable-and-executable"
chmod +x "$script_dirS/file-checker/readable-and-executable"
chmod +x "$script_dirS/file-checker/readable-writable-executable"
cd ..
fi
challenge() {
submitted=$(bash "$script_dirS"/student/file-checker.sh "$1")
expected=$(bash "$script_dirS"/solutions/file-checker.sh "$1")
diff <(echo "$submitted") <(echo "$expected")
}
challenge "$script_dirS/file-checker/readable-only"
challenge "$script_dirS/file-checker/readable-and-writable"
challenge "$script_dirS/file-checker/readable-and-executable"
challenge "$script_dirS/file-checker/readable-writable-executable"
rm -rf file-checker

17
sh/tests/file-details_test.sh

@ -1,17 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
submitted=$(cd "$1" && bash "$script_dirS"/student/file-details.sh)
expected=$(cd "$1" && bash "$script_dirS"/solutions/file-details.sh)
diff <(echo "$submitted") <(echo "$expected")
}
challenge hard-perm

127
sh/tests/file-researcher/facts.txt

@ -1,127 +0,0 @@
Indonesia consists only of islands - 13,667 total
During World War II, the very first bomb dropped on Berlin by the Allies killed the only elephant in the Berlin Zoo
People who ride on roller coasters have a higher chance of having a blood clot in the brain
The tallest freestanding sculpture in the world is Chief Crazy Horse in South Dakota, USA
Marie Curie, the Nobel prize winning scientist who discovered radium, died of radiation poisoning
898 tornadoes were recorded to have occurred in the United States in the year 2000.
The word Popcorn is derived from the middle English word "poppe," which means "explosive sound"
The food that is digested in your stomach is called "chyme."
Alcohol beverages have all 13 minerals necessary for human life
The sentence "The quick brown fox jumps over the lazy dog." uses every letter in the alphabet. (Developed by Western Union to Test telex/twxcommunications)
The word housekeeping was invented by Shakespeare
The only two days of the year in which there are no professional sports games (MLB, NBA, NHL, or NFL) are the day before and the day after theMajorLeague All-Star Game.
In the great fire of London in 1666 half of London was burnt down but only 6 people were injured
Lack of sleep can affect your immune system and reduce your ability to fight infections
All dogs are the descendant of the wolf. These wolves lived in eastern Asia about 15,000 years ago
It is not possible to tickle yourself. The cerebellum, a part of the brain, warns the rest of the brain that you are about to tickle yourself. Since your brain knows this, it ignores the resulting sensation
Parma ham is only Parma ham if it is made in the Parma region of Italy. The British chain supermarket Asda, made and packaged its own "Parma ham" and was successfully sued by the real Parma ham people (Parma Ham Trade Association)
With winds of 50 miles per hour, The Statue of Liberty sways three inches and the torch sways five inches
A famous bullfighter, Lagarijo, killed 4,867 bulls in the 19th century.
Police detectives have used snapping turtles to help them locate dead bodies
In most advertisements, including newspapers, the time displayed on a watch is 10:10
The national sport of Japan is sumo wrestling
The early occurrence of a fetus yawning is at eleven weeks after conception
In a month, a fingernail grows an eighth of an inch
Edward VIII did not officially become the King of England as he abdicated the throne to marry an American divorcee
The book "Little Red Riding Hood" was banned in 1990 by two school districts in California. They did this because in the book there was a picture of a basket that had a bottle of wine in it
The reason why golf balls have dimples on them is because it helps in the ball to move a farther distance by reducing drag
Americans consume the most peanut butter in the world
Celtic warriors sometimes fought their battles naked, their bodies dyed blue from head to toe
To make butter more attractive in color, carrot juice was used by people in the Middle Ages
Early hockey games allowed as many as 30 players a side on the ice
Most fleas do not live past a year old
It takes seven to ten days to make a jelly belly jellybean
Some asteroids have other asteroids orbiting them
Maine is the only state whose name is just one syllable
The male praying mantis cannot copulate while its head is attached to its body. The female initiates sex by ripping the males head off
There is enough concrete in the Hoover Dam to pave a two lane highway from San Francisco to New York
Americans on the average eat 18 acres of pizza every day
Every 238 years, the orbits of Neptune and Pluto change making Neptune at times the farthest planet from the sun
There is a certain species of kangaroo that is only 2.5 centimeters long when it is born
In a lifetime, the average house cat spends approximately 10,950 hours purring
The real name of Toto the dog in "The Wizard Of Oz" was Terry
Stannous fluoride, which is the cavity fighter found in toothpaste is made from recycled tin
It takes 12 honeybees to make one teaspoon of honey
Thomas Watson, who was the chairman of IBM in 1943 predicted that their would probably only be a world market for five computers.
The largest hamburger cooked in the world weighed in at 6,040 pounds
The first lighthouse was in Alexandria in 290 B.C
Heinz first started making ketchup in 1876 and the recipe has remained the same ever since
The largest wedding chapel in Las Vegas is the Viva Las Vegas Chapel, which can seat 100 people
The most popular name for a pet in the United States is Max
Spiral staircases in medieval castles are running clockwise. This is because all knights used to be right-handed. When the intruding army would climb the stairs they would not be able to use their right hand which was holding the sword because of the difficulties of climbing the stairs. Left-handed knights would have had no troubles, except left-handed people could never become knights because it was assumed that they were descendants of the devil
The largest shopping mall in the world is the West Edmonton Mall located in Edmonton, Alberta, Canada
The CN Tower located in Toronto, Ontario Canada took a total construction time of 40 months to complete at an original cost of $63 million
The 20th president of the United States, James Garfield, was able to write Greek with one hand and Latin with the other at the same time
The country of Andorra has a zero percent unemployment rate
In Los Angeles, there are fewer people than there are automobiles
A woman has approximately 4.5 litres of blood in her body, while men have 5.6 litres
In India, pickled ginger, minced mutton and a cottage cheese like substance are popular pizza toppings
Oral-B were the first toothbrushes to go to the moon when they were aboard the Apollo 11 mission
A maple tree is usually tapped when the tree is at least 45 years old and has a diameter of 12 inches
In 1998, a law passed in the U.S. state of Virginia allows drivers to keep their road kill, as long as they report it within 12 hours. updated
A language becomes extinct in this world every two weeks
An acre of trees can remove about 13 tons of dust and gases every year from the surrounding environment
The decomposition point of Olive Oil is 220 degrees Celsius
Ten radishes only contain eight calories
Annually a thousand people are killed by scorpions in Mexico
Every year, 100 million sharks are killed by people
Tug of war was an Olympic event from 1900-1920
Of all the countries, Brazil has the most plant species, with over 56,000
One female mouse can produce up to 100 babies a year
Impotence is grounds for divorce in 26 U.S. states
Women who are romance novel readers are reported to make love 74% more often with their partners than women who do not read romance novels.
The average lifespan of a human taste bud is ten days
The monogram "RR" for Rolls-Royce has never been altered, except for when Sir Henry Royce passed away in 1933. Then it was changed from red to black.
People with darker skin will not wrinkle as fast as people with lighter skin
Fido means faithful in Latin
Pebbles cereal was actually named after the shape of the cereal and not the Pebbles Flintstone character
A group of kangaroos is called a mob
Cat's urine glows under a blacklight.
Every three seconds, a new baby is born
More than 260,000 people have been killed by volcanic activity since 1700 AD.
The only predator that polar bears have are humans
Many insects can carry 50 times their own body weight
The last land battle of the U.S. Civil War was fought in Texas
Annually 7 million tons of textiles and clothing is thrown out. Out of this, only 12% is used again or recycled
A scorpion can have up to 12 eyes
A snake charmer in Bangladesh once found 3,500 poisonous cobras and their eggs hidden underneath the floors of two suburban homes
The IRS employees tax manual has instructions for collecting taxes after a nuclear war
There are approximately fifty Bibles sold each minute across the world
The pectin that is found in apples aids in lowering cholesterol levels
Post-It Notes, which are adhesive notes, were invented while looking for a way to improve the acrylate adhesive found in tapes
Crayola Crayons currently has over 120 different crayon colors
Odontophobia is the fear of teeth
The width of a tornado can range from less than ten yards to more than a mile.
In Johannesburg, the average car will be involved in an accident once every four years.
The youngest actress to be nominated as best actress is Keisha Castle-Hughes who was nominated at just 13 years old
The Taj Mahal was actually built for use as a tomb
According to studies, an average roll of toilet paper lasts about five days in the bathroom
Almonds are members of the peach family
The oldest known disease in the world is leprosy
A fall of 30 feet can be survived my most cats
The largest member of the dolphin family are orcas
In 1477, the first diamond engagement ring was given to Mary of Burgundy by Archduke Maximillian of Austria
The hormone replacement drug "Premarin" is made from the urine of pregnant horses
TWIX Caramel Cookie Bars were first introduced in 1979
Nintendo was first establish in 1889 and they started out making special playing cards
People over the age of fifty will start to lose their dislike for foods that taste bitter
In Kentucky, 50 percent of the people who get married for the first time are teenagers
Elephants have been known to learn up to 60 commands
On average 1,668 gallons of water are used by each person in the United States daily
Copper is the second most used metal in the world.
Milton Bradley originally wanted to name the game Twister, Pretzel; but he could not since the name was copyrighted
According to studies, men prefer to have white bedrooms and women prefer to have blue bedrooms
If someone was to fly once around the surface of the moon, it would be equal to a round trip from New York to London
St. Patrick never really drove out any snakes from Ireland. This story was an analogy of how he drove paganism out of Ireland
Fat is important for the development of children and normal growth
The most common seasonings found in American homes are chili powder, cinnamon, and seasoned salts
People who have eaten beetles say that it tastes like apples
Montreal was named after a local mountain "Mont Royal."
Millie the White House dog earned more than 4 times as much as President Bush in 1991. And, rightfully so
In an average lifetime, a person will spend 4 years traveling in an automobile and six months waiting at a red light.
A small drip from a faucet can waste up to 50 gallons of water daily, which is enough water to run a dishwasher twice on a full cycle
Kotex was first manufactured as bandages, during W.W.I
The longest Monopoly game ever played was 1,680 hours long, which is seventy straight days
The first known contraceptive was crocodile dung, used by Egyptians in 2000 B.C
Over 1,600 people in North America have been victims of trunk entrapment (being locked inside of a car trunk)
A rhinoceros horn is made of compacted hair

28
sh/tests/file-researcher_test.sh

@ -1,28 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/file-researcher.sh"
# True if FILE exists and is a regular file
if [ -f ${FILENAME} ]; then
# FILE exists and it's not empty
if [ -s ${FILENAME} ]; then
if [[ $(cat $FILENAME | grep echo | wc -l) -ne 0 ]]; then
echo "echo is not allowed in this exercise!"
exit 1
fi
submitted=$(bash $FILENAME)
expected=$(bash solutions/file-researcher.sh)
diff <(echo "$submitted") <(echo "$expected")
else
echo "The file exist but is empty"
exit 1
fi
else
echo "File does not exist"
exit 1
fi

16
sh/tests/file-struct_test.sh

@ -1,16 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
print_content() {
mkdir -p uncompressed
tar -xpf file-struct.tar -C uncompressed
tree uncompressed
}
submitted=$(cd student && print_content)
expected=$(cd solutions && print_content)
diff <(echo "$submitted") <(echo "$expected")

0
sh/tests/find-files-extension/folder1/file1.txt

0
sh/tests/find-files-extension/folder1/file2.txt

0
sh/tests/find-files-extension/folder1/file3.txt

0
sh/tests/find-files-extension/folder1/test4.sh

0
sh/tests/find-files-extension/folder2/fileInsideAfolder4.txt

0
sh/tests/find-files-extension/folder2/test.sh

0
sh/tests/find-files-extension/folder2/testtxt/fileInsideAfolder5.txt

0
sh/tests/find-files-extension/folder2/testtxt/test/fileInsideAfolder6.txt

0
sh/tests/find-files-extension/folder2/testtxt/test/lol.sh

35
sh/tests/find-files-extension_test.sh

@ -1,35 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/find-files-extension.sh"
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
submitted=$(cd "$1" && bash "$script_dirS"/$FILENAME)
expected=$(cd "$1" && bash "$script_dirS"/solutions/find-files-extension.sh)
diff <(echo "$submitted") <(echo "$expected")
}
# True if FILE exists and is a regular file
if [ -f ${FILENAME} ]; then
# FILE exists and it's not empty
if [ -s ${FILENAME} ]; then
if [[ $(cat $FILENAME | grep echo | wc -l) -ne 0 ]]; then
echo "echo is not allowed in this exercise!";
exit 1
fi
challenge find-files-extension/folder1
challenge find-files-extension/folder2
else
echo "The file exist but is empty"
exit 1
fi
else
echo "File does not exist"
exit 1
fi

0
sh/tests/find-files/folder2/aa/ba/ab

0
sh/tests/find-files/folder2/aa/ba/bz

0
sh/tests/find-files/folder2/alphabet

0
sh/tests/find-files/folder2/ba/aa/alphabetz!

0
sh/tests/find-files/folder2/ba/aa/cz

0
sh/tests/find-files/folder2/ba/aa/za!

0
sh/tests/find-files/folder2/ba/alphabetz

35
sh/tests/find-files_test.sh

@ -1,35 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/find-files.sh"
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
submitted=$(cd "$1" && bash "$script_dirS"/$FILENAME)
expected=$(cd "$1" && bash "$script_dirS"/solutions/find-files.sh)
diff <(echo "$submitted") <(echo "$expected")
}
# True if FILE exists and is a regular file
if [ -f ${FILENAME} ]; then
# FILE exists and it's not empty
if [ -s ${FILENAME} ]; then
if [[ $(cat $FILENAME | grep echo | wc -l) -ne 0 ]]; then
echo "echo is not allowed in this exercise!";
exit 1
fi
challenge find-files/folder1
challenge find-files/folder2
else
echo "The file exist but is empty"
exit 1
fi
else
echo "File does not exist"
exit 1
fi

88
sh/tests/grades_test.sh

@ -1,88 +0,0 @@
#!/usr/bin/env bash
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
input="${@: -1}"
args=${@:1:$#-1}
submitted=$(
bash -c ""$script_dirS"/student/grades.sh $args" <<EOF
$input
EOF
)
expected=$(
bash -c ""$script_dirS"/solutions/grades.sh $args" <<EOF
$input
EOF
)
diff <(echo "$submitted") <(echo "$expected")
if [ $? != 0 ]; then
exit 1
fi
}
challenge 1 "Student1
90
"
challenge 1 "Student2
70
"
challenge 1 "Student3
50
"
challenge 1 "Student4
92
"
challenge 1 "Student5
75
"
challenge 1 "Student6
55
"
challenge 1 "Student7
25
"
challenge 2 "Student1
0
Alice
100
"
challenge 3 "Bob
90
Alice
75
Eve
55
"
challenge 5 "Bob
90
Alice
75
Eve
55
john
49
Eric
65
"
challenge 3 "Bob
90
Alice
150
Eve
55
"
challenge 1 "Student1
not_good
"
challenge 1 "Student1
-75
"
challenge 1 1 "Louis
20
"

29
sh/tests/greatest-of-all_test.sh

@ -1,29 +0,0 @@
#!/usr/bin/env bash
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
submitted=$(echo -e "0\n3\n2\n5\n7\n1\n4\n9\n8\n6\n10" | bash -c ""$script_dirS"/student/greatest-of-all.sh")
expected=$(echo -e "0\n3\n2\n5\n7\n1\n4\n9\n8\n6\n10" | bash -c ""$script_dirS"/solutions/greatest-of-all.sh")
diff <(echo "$submitted") <(echo "$expected")
submitted=$(echo -e "26\n85\n21\n94\n68\n60\n99\n31\n10\n98\n" | bash -c ""$script_dirS"/student/greatest-of-all.sh")
expected=$(echo -e "26\n85\n21\n94\n68\n60\n99\n31\n10\n98\n" | bash -c ""$script_dirS"/solutions/greatest-of-all.sh")
diff <(echo "$submitted") <(echo "$expected")
submitted=$(echo -e "152\n485\n569\n611\n871\n551\n984\n895\n285\n989\n" | bash -c ""$script_dirS"/student/greatest-of-all.sh")
expected=$(echo -e "152\n485\n569\n611\n871\n551\n984\n895\n285\n989\n" | bash -c ""$script_dirS"/solutions/greatest-of-all.sh")
diff <(echo "$submitted") <(echo "$expected")
submitted=$(echo -e "152\n10001\n569" | bash -c ""$script_dirS"/student/greatest-of-all.sh")
expected=$(echo -e "152\n10001\n569" | bash -c ""$script_dirS"/solutions/greatest-of-all.sh")
diff <(echo "$submitted") <(echo "$expected")
submitted=$(echo -e "152\n485\nalpha\n" | bash -c ""$script_dirS"/student/greatest-of-all.sh")
expected=$(echo -e "152\n485\nalpha\n" | bash -c ""$script_dirS"/solutions/greatest-of-all.sh")
diff <(echo "$submitted") <(echo "$expected")
submitted=$(echo -e "152\n485\n-45\n45\n" | bash -c ""$script_dirS"/student/greatest-of-all.sh")
expected=$(echo -e "152\n485\n-45\n45" | bash -c ""$script_dirS"/solutions/greatest-of-all.sh")
diff <(echo "$submitted") <(echo "$expected")
}
challenge

19
sh/tests/hard-conditions_test.sh

@ -1,19 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
echo "echo hello word" >test-hard-conditions.sh
echo "echo hello word" >non-ex
chmod +x test-hard-conditions.sh
submitted=$(bash "$script_dirS"/student/hard-conditions.sh test-hard-conditions.sh)
expected=$(bash "$script_dirS"/solutions/hard-conditions.sh test-hard-conditions.sh)
diff <(echo "$submitted") <(echo "$expected")
submitted=$(bash "$script_dirS"/student/hard-conditions.sh non-ex)
expected=$(bash "$script_dirS"/solutions/hard-conditions.sh non-ex)
diff <(echo "$submitted") <(echo "$expected")

17
sh/tests/hard-perm_test.sh

@ -1,17 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
chmod 776 hard-perm/*
challenge() {
submitted=$(bash "$script_dirS"/student/hard-perm.sh && ls -l "$1" | awk '{print $1}')
expected=$(bash "$script_dirS"/solutions/hard-perm.sh && ls -l "$1" | awk '{print $1}')
diff <(echo "$submitted") <(echo "$expected")
}
challenge hard-perm/

28
sh/tests/head-and-tail_test.sh

@ -1,28 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/head-and-tail.sh"
# True if FILE exists and is a regular file
if [ -f ${FILENAME} ]; then
# FILE exists and it's not empty
if [ -s ${FILENAME} ]; then
if [[ $(cat $FILENAME | grep echo | wc -l) -ne 0 ]]; then
echo "echo is not allowed in this exercise!";
exit 1
fi
submitted=$(bash $FILENAME)
expected=$(bash solutions/head-and-tail.sh)
diff <(echo "$submitted") <(echo "$expected")
else
echo "The file exist but is empty"
exit 1
fi
else
echo "File does not exist"
exit 1
fi

24
sh/tests/hello-devops_test.sh

@ -1,24 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/hello-devops.sh"
# True if FILE exists and is a regular file
if [ -f ${FILENAME} ]; then
# FILE exists and it's not empty
if [ -s ${FILENAME} ]; then
submitted=$(bash $FILENAME)
expected=$(bash solutions/hello-devops.sh)
diff <(echo "$submitted") <(echo "$expected") | cat -t
else
echo "The file exist but is empty"
exit 1
fi
else
echo "File does not exist"
exit 1
fi

40
sh/tests/in-back-ground_test.sh

@ -1,40 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/in-back-ground.sh"
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
echo "- Australia is wider than the moon. The moon sits at 3400km in diameter, while Australia's diameter from east to west is almost 4000km." >facts
challenge() {
submitted=$(cd "$1" && bash "$script_dirS"/$FILENAME)
std_out=$(cat output.txt)
expected=$(cd "$1" && bash "$script_dirS"/solutions/in-back-ground.sh)
sol_out=$(cat output.txt)
diff <(echo "$submitted") <(echo "$expected")
diff <(echo "$std_out") <(echo "$sol_out")
}
challenge_no_output() {
if [[ -f output.txt ]]; then
exit 1
fi
submitted=$(cd "$1" && bash "$script_dirS"/$FILENAME)
expected=$(cd "$1" && bash "$script_dirS"/solutions/in-back-ground.sh)
diff <(echo "$submitted") <(echo "$expected")
}
if [[ $(cat $FILENAME | grep 'nohup' | wc -l) -lt 1 ]]; then
echo "The file does not contain the required commands"
exit 1
fi
challenge .
rm output.txt
echo "The sun is a star!" >facts
challenge_no_output .

29
sh/tests/in-the-dark_test.sh

@ -1,29 +0,0 @@
#!/usr/bin/env bash
# Unofficial Bash Strict Mode
set -euo pipefail
IFS='
'
FILENAME="student/in-the-dark.sh"
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
submitted=$(cd "$1" && bash "$script_dirS"/$FILENAME)
expected=$(cd "$1" && bash "$script_dirS"/solutions/in-the-dark.sh)
diff <(echo "$submitted") <(echo "$expected")
}
# True if FILE exists and is a regular file
if [ -f ${FILENAME} ]; then
# FILE exists and it's not empty
if [ -s ${FILENAME} ]; then
challenge .
else
echo "The file exist but is empty"
exit 1
fi
else
echo "File does not exist"
exit 1
fi

20
sh/tests/input-redirection_test.sh

@ -1,20 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
$(bash "$script_dirS"/student/input-redirection.sh)
submitted=$(bash "$script_dirS"/show-info.sh)
rm show-info.sh
$(bash "$script_dirS"/solutions/input-redirection.sh)
expected=$(bash "$script_dirS"/show-info.sh)
rm show-info.sh
diff <(echo "$submitted") <(echo "$expected")
}
challenge

69
sh/tests/joker-num_test.sh

@ -1,69 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
IFS='
'
script_dirS=$(cd -P "$(dirname "$BASH_SOURCE")" &>/dev/null && pwd)
challenge() {
args=${@:1:$#-1}
input="${@: -1}"
submitted=$(
./student/joker-num.sh $args <<EOF
$input
EOF
)
expected=$(
./solutions/joker-num.sh $args <<EOF
$input
EOF
)
diff <(echo "$submitted") <(echo "$expected")
}
# Good input, win
challenge 50 "1
100
49
51
50
"
# Good input, lose
challenge 50 "10
20
30
40
41
42
"
# Bad arguments
challenge "10"
# Bad arguments
challenge 0 "10"
# Bad arguments
challenge 101 "10"
# Bad arguments
challenge -20 "10"
# Bad arguments
challenge aa "10"
# Handle bad input
challenge 78 "10
aa
3000
-10
0
0
40
80
79
78"

Some files were not shown because too many files changed in this diff diff.show_more

Loading…
Cancel
Save