mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-06 01:18:23 +08:00
Added tests for Strings algorithms (#390)
* test: added tests for check anagram function
This commit is contained in:
@ -44,7 +44,4 @@ const checkAnagram = (str1, str2) => {
|
|||||||
return 'Anagrams'
|
return 'Anagrams'
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(checkAnagram('abcd', 'bcad')) // should print anagram
|
export { checkAnagram }
|
||||||
console.log(checkAnagram('abcd', 'abef')) // should print not anagram
|
|
||||||
console.log(checkAnagram(10, 'abcd'))// should print Not String(s).
|
|
||||||
console.log(checkAnagram('abs', 'abds'))// should print not anagram
|
|
||||||
|
31
String/CheckAnagram.test.js
Normal file
31
String/CheckAnagram.test.js
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { checkAnagram } from './CheckAnagram'
|
||||||
|
|
||||||
|
describe('checkAnagram', () => {
|
||||||
|
it.each`
|
||||||
|
inputOne | inputTwo
|
||||||
|
${123456} | ${'abcd'}
|
||||||
|
${[1, 2, 3, 4, 5, 6]} | ${'abcd'}
|
||||||
|
${{ test: 'test' }} | ${'abcd'}
|
||||||
|
${'abcd'} | ${123456}
|
||||||
|
${'abcd'} | ${[1, 2, 3, 4, 5, 6]}
|
||||||
|
${'abcd'} | ${{ test: 'test' }}
|
||||||
|
`(
|
||||||
|
'expects to return "Not string(s)" given values $inputOne and $inputTwo',
|
||||||
|
({ inputOne, inputTwo }) => {
|
||||||
|
const SUT = checkAnagram(inputOne, inputTwo)
|
||||||
|
expect(SUT).toBe('Not string(s)')
|
||||||
|
}
|
||||||
|
)
|
||||||
|
it('expects to return "Not anagram" if the arguments have different lengths', () => {
|
||||||
|
const SUT = checkAnagram('abs', 'abds')
|
||||||
|
expect(SUT).toBe('Not Anagram')
|
||||||
|
})
|
||||||
|
it('expects to return "Not anagram" if the arguments are not anagrams', () => {
|
||||||
|
const SUT = checkAnagram('abcs', 'abds')
|
||||||
|
expect(SUT).toBe('Not anagrams')
|
||||||
|
})
|
||||||
|
it('expects to return "Anagram" if the arguments are anagram', () => {
|
||||||
|
const SUT = checkAnagram('abcd', 'bcad')
|
||||||
|
expect(SUT).toBe('Anagrams')
|
||||||
|
})
|
||||||
|
})
|
@ -21,5 +21,4 @@ const checkPalindrome = (str) => {
|
|||||||
return 'Palindrome'
|
return 'Palindrome'
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(checkPalindrome('madam'))
|
export { checkPalindrome }
|
||||||
console.log(checkPalindrome('abcd'))
|
|
||||||
|
16
String/CheckPalindrome.test.js
Normal file
16
String/CheckPalindrome.test.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { checkPalindrome } from './CheckPalindrome'
|
||||||
|
|
||||||
|
describe('checkPalindrome', () => {
|
||||||
|
it('expects to return "Palindrome" if the given string is a palindrome', () => {
|
||||||
|
const SUT = checkPalindrome('madam')
|
||||||
|
expect(SUT).toBe('Palindrome')
|
||||||
|
})
|
||||||
|
it('expects to return "Empty string" if the given string is empty', () => {
|
||||||
|
const SUT = checkPalindrome('')
|
||||||
|
expect(SUT).toBe('Empty string')
|
||||||
|
})
|
||||||
|
it('expects to return "Not a string" if the given string is not a string', () => {
|
||||||
|
const SUT = checkPalindrome(123)
|
||||||
|
expect(SUT).toBe('Not a string')
|
||||||
|
})
|
||||||
|
})
|
@ -8,6 +8,9 @@ return the starting index if the given pattern is
|
|||||||
available in the text
|
available in the text
|
||||||
*/
|
*/
|
||||||
const checkIfPatternExists = (text, pattern) => {
|
const checkIfPatternExists = (text, pattern) => {
|
||||||
|
if (typeof text !== 'string' || typeof pattern !== 'string') {
|
||||||
|
throw new TypeError('Given input is not a string')
|
||||||
|
}
|
||||||
const textLength = text.length // Store the length of the text in a variable
|
const textLength = text.length // Store the length of the text in a variable
|
||||||
const patternLength = pattern.length // Store the length of the pattern in a variable
|
const patternLength = pattern.length // Store the length of the pattern in a variable
|
||||||
|
|
||||||
@ -22,15 +25,10 @@ const checkIfPatternExists = (text, pattern) => {
|
|||||||
// j + 1 is equal to the length of the pattern
|
// j + 1 is equal to the length of the pattern
|
||||||
if (j + 1 === patternLength) {
|
if (j + 1 === patternLength) {
|
||||||
console.log(`Given pattern is found at index ${i}`)
|
console.log(`Given pattern is found at index ${i}`)
|
||||||
|
return `Given pattern is found at index ${i}`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const main = () => {
|
export { checkIfPatternExists }
|
||||||
const text = 'AABAACAADAABAAAABAA'
|
|
||||||
const pattern = 'AABA'
|
|
||||||
checkIfPatternExists(text.toLowerCase(), pattern.toLowerCase())
|
|
||||||
}
|
|
||||||
|
|
||||||
main()
|
|
||||||
|
26
String/PatternMatching.test.js
Normal file
26
String/PatternMatching.test.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { checkIfPatternExists } from './PatternMatching'
|
||||||
|
describe('checkIfPatternExists', () => {
|
||||||
|
it('expects to find a pattern with correct input', () => {
|
||||||
|
const text = 'AABAACAADAABAAAABAA'
|
||||||
|
const pattern = 'AABA'
|
||||||
|
const SUT = checkIfPatternExists(text.toLowerCase(), pattern.toLowerCase())
|
||||||
|
expect(SUT).toBe('Given pattern is found at index 0')
|
||||||
|
})
|
||||||
|
it('expects to return a message when there is no pattern', () => {
|
||||||
|
const text = 'ABCDEFG'
|
||||||
|
const pattern = 'AEG'
|
||||||
|
const SUT = checkIfPatternExists(text.toLowerCase(), pattern.toLowerCase())
|
||||||
|
expect(SUT).toBe(undefined)
|
||||||
|
})
|
||||||
|
it('expects to find a pattern independent of casing', () => {
|
||||||
|
const text = 'AbCAAAAAAB'
|
||||||
|
const pattern = 'abc'
|
||||||
|
const SUT = checkIfPatternExists(text, pattern)
|
||||||
|
expect(SUT).toBe(undefined)
|
||||||
|
})
|
||||||
|
it('expects to throw an error message when given inpuut is not a string', () => {
|
||||||
|
const text = 123444456
|
||||||
|
const pattern = 123
|
||||||
|
expect(() => checkIfPatternExists(text, pattern)).toThrow('Given input is not a string')
|
||||||
|
})
|
||||||
|
})
|
@ -9,6 +9,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
function ReverseStringIterative (string) {
|
function ReverseStringIterative (string) {
|
||||||
|
if (typeof string !== 'string') {
|
||||||
|
throw new TypeError('The given value is not a string')
|
||||||
|
}
|
||||||
let reversedString = ''
|
let reversedString = ''
|
||||||
let index
|
let index
|
||||||
|
|
||||||
@ -28,6 +31,9 @@ function ReverseStringIterative (string) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
function ReverseStringIterativeInplace (string) {
|
function ReverseStringIterativeInplace (string) {
|
||||||
|
if (typeof string !== 'string') {
|
||||||
|
throw new TypeError('The given value is not a string')
|
||||||
|
}
|
||||||
const _string = string.split('')
|
const _string = string.split('')
|
||||||
|
|
||||||
for (let i = 0; i < Math.floor(_string.length / 2); i++) {
|
for (let i = 0; i < Math.floor(_string.length / 2); i++) {
|
||||||
@ -40,6 +46,4 @@ function ReverseStringIterativeInplace (string) {
|
|||||||
return _string.join('')
|
return _string.join('')
|
||||||
}
|
}
|
||||||
|
|
||||||
// testing
|
export { ReverseStringIterative, ReverseStringIterativeInplace }
|
||||||
console.log(ReverseStringIterative('Javascript'))
|
|
||||||
console.log(ReverseStringIterativeInplace('Javascript'))
|
|
||||||
|
63
String/ReverseString.test.js
Normal file
63
String/ReverseString.test.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import {
|
||||||
|
ReverseStringIterative,
|
||||||
|
ReverseStringIterativeInplace
|
||||||
|
} from './ReverseString'
|
||||||
|
|
||||||
|
describe('ReverseStringIterative', () => {
|
||||||
|
it('expects to reverse a simple string', () => {
|
||||||
|
const SUT = ReverseStringIterative('reverse')
|
||||||
|
expect(SUT).toEqual('esrever')
|
||||||
|
})
|
||||||
|
it('expects to reverse a string with spaces in between', () => {
|
||||||
|
const SUT = ReverseStringIterative('reverse me')
|
||||||
|
expect(SUT).toEqual('em esrever')
|
||||||
|
})
|
||||||
|
it('expects to reverse a simple string without capitalizing the first letter', () => {
|
||||||
|
const SUT = ReverseStringIterative('Javascript')
|
||||||
|
expect(SUT).toEqual('tpircsavaJ')
|
||||||
|
})
|
||||||
|
it.each`
|
||||||
|
input
|
||||||
|
${123456}
|
||||||
|
${[1, 2, 3, 4, 5, 6]}
|
||||||
|
${{ test: 'test' }}
|
||||||
|
`(
|
||||||
|
'expects to throw a type error given a value that is $input',
|
||||||
|
({ input }) => {
|
||||||
|
expect(() => {
|
||||||
|
ReverseStringIterative(input)
|
||||||
|
}).toThrow('The given value is not a string')
|
||||||
|
}
|
||||||
|
)
|
||||||
|
it('expects to return a empty string with an empty string is given', () => {
|
||||||
|
const SUT = ReverseStringIterative('')
|
||||||
|
expect(SUT).toEqual('')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
describe('ReverseStringIterativeInplace', () => {
|
||||||
|
it('expects to reverse a simple string', () => {
|
||||||
|
const SUT = ReverseStringIterativeInplace('reverse')
|
||||||
|
expect(SUT).toEqual('esrever')
|
||||||
|
})
|
||||||
|
it('expects to reverse a simple string without capitalizing the first letter', () => {
|
||||||
|
const SUT = ReverseStringIterativeInplace('Javascript')
|
||||||
|
expect(SUT).toEqual('tpircsavaJ')
|
||||||
|
})
|
||||||
|
it('expects to return an empty string given an empty string', () => {
|
||||||
|
const SUT = ReverseStringIterativeInplace('Javascript')
|
||||||
|
expect(SUT).toEqual('tpircsavaJ')
|
||||||
|
})
|
||||||
|
it.each`
|
||||||
|
input
|
||||||
|
${123456}
|
||||||
|
${[1, 2, 3, 4, 5, 6]}
|
||||||
|
${{ test: 'test' }}
|
||||||
|
`(
|
||||||
|
'expects to throw a type error given a value that is $input',
|
||||||
|
({ input }) => {
|
||||||
|
expect(() => {
|
||||||
|
ReverseStringIterativeInplace(input)
|
||||||
|
}).toThrow('The given value is not a string')
|
||||||
|
}
|
||||||
|
)
|
||||||
|
})
|
@ -1,4 +1,7 @@
|
|||||||
const reverseWords = (str) => {
|
const reverseWords = (str) => {
|
||||||
|
if (typeof str !== 'string') {
|
||||||
|
throw new TypeError('The given value is not a string')
|
||||||
|
}
|
||||||
// Split string into words
|
// Split string into words
|
||||||
// Ex. "I Love JS" => ["I", "Love", "JS"]
|
// Ex. "I Love JS" => ["I", "Love", "JS"]
|
||||||
const words = str.split(' ')
|
const words = str.split(' ')
|
||||||
@ -10,6 +13,4 @@ const reverseWords = (str) => {
|
|||||||
return reversedWords.join(' ')
|
return reversedWords.join(' ')
|
||||||
}
|
}
|
||||||
|
|
||||||
// testing
|
export { reverseWords }
|
||||||
console.log(reverseWords('I Love JS'))
|
|
||||||
console.log(reverseWords('My Name Is JavaScript'))
|
|
||||||
|
21
String/ReverseWords.test.js
Normal file
21
String/ReverseWords.test.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import { reverseWords } from './ReverseWords'
|
||||||
|
|
||||||
|
describe('reverseWords', () => {
|
||||||
|
it('expects to reverse words to return a joined word', () => {
|
||||||
|
const SUT = reverseWords('I Love JS')
|
||||||
|
expect(SUT).toBe('JS Love I')
|
||||||
|
})
|
||||||
|
it.each`
|
||||||
|
input
|
||||||
|
${123456}
|
||||||
|
${[1, 2, 3, 4, 5, 6]}
|
||||||
|
${{ test: 'test' }}
|
||||||
|
`(
|
||||||
|
'expects to throw a type error given a value that is $input',
|
||||||
|
({ input }) => {
|
||||||
|
expect(() => {
|
||||||
|
reverseWords(input)
|
||||||
|
}).toThrow('The given value is not a string')
|
||||||
|
}
|
||||||
|
)
|
||||||
|
})
|
12
babel.config.js
Normal file
12
babel.config.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
module.exports = {
|
||||||
|
presets: [
|
||||||
|
[
|
||||||
|
'@babel/preset-env',
|
||||||
|
{
|
||||||
|
targets: {
|
||||||
|
esmodules: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
8051
package-lock.json
generated
Normal file
8051
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
15
package.json
15
package.json
@ -2,17 +2,26 @@
|
|||||||
"name": "javascript",
|
"name": "javascript",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "A repository for All algorithms implemented in Javascript (for educational purposes only)",
|
"description": "A repository for All algorithms implemented in Javascript (for educational purposes only)",
|
||||||
|
"main": "",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "jest --no-cache"
|
||||||
},
|
},
|
||||||
"author": "TheAlgorithms",
|
"author": "TheAlgorithms",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@babel/core": "^7.11.6",
|
||||||
|
"@babel/plugin-transform-runtime": "^7.11.5",
|
||||||
|
"@babel/preset-env": "^7.11.5",
|
||||||
"jsdom": "^16.3.0",
|
"jsdom": "^16.3.0",
|
||||||
"node-fetch": "2.6.1"
|
"node-fetch": "2.6.1"
|
||||||
},
|
},
|
||||||
|
"standard": {
|
||||||
|
"env": [ "jest" ]
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"standard": "^14.3.4",
|
"babel-jest": "^26.3.0",
|
||||||
"doctest": "^0.17.1"
|
"doctest": "^0.17.1",
|
||||||
|
"jest": "^26.4.2",
|
||||||
|
"standard": "^14.3.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user