Skip to content
Snippets Groups Projects
Commit c50e64f8 authored by Shpuld Shpludson's avatar Shpuld Shpludson
Browse files

Add tests for gesture service, fix bug with perpendicular directions

parent e23c1946
No related branches found
No related tags found
2 merge requests!1028`master` refresh with `develop`,!714Add a gesture service for easier touch gestures
......@@ -10,11 +10,14 @@ const touchEventCoord = e => ([e.touches[0].screenX, e.touches[0].screenY])
const vectorLength = v => Math.sqrt(v[0] * v[0] + v[1] * v[1])
const perpendicular = v => [v[1], v[0]]
const perpendicular = v => [v[1], -v[0]]
const dotProduct = (v1, v2) => v1[0] * v2[0] + v1[1] * v2[1]
const vectorFlatten = (v1, v2) => [v1[0] * v2[0], v1[1] * v2[1]]
const project = (v1, v2) => {
const scalar = (dotProduct(v1, v2) / dotProduct(v2, v2))
return [scalar * v2[0], scalar * v2[1]]
}
// direction: either use the constants above or an arbitrary 2d vector.
// threshold: how many Px to move from touch origin before checking if the
......@@ -46,12 +49,12 @@ const updateSwipe = (event, gesture) => {
// movement is opposite from direction
if (dotProduct(delta, gesture.direction) < 0) return
// movement perpendicular to direction is too much
const towardsDir = vectorFlatten(gesture.direction, delta)
const towardsDir = project(delta, gesture.direction)
const perpendicularDir = perpendicular(gesture.direction)
const towardsPerpendicular = vectorFlatten(perpendicularDir, delta)
const towardsPerpendicular = project(delta, perpendicularDir)
if (
vectorLength(towardsDir) <
gesture.perpendicularTolerance * vectorLength(towardsPerpendicular)
vectorLength(towardsDir) * gesture.perpendicularTolerance <
vectorLength(towardsPerpendicular)
) return
gesture.onSwipe()
......
import GestureService from 'src/services/gesture_service/gesture_service.js'
const mockTouchEvent = (x, y) => ({
touches: [
{
screenX: x,
screenY: y
}
]
})
describe.only('GestureService', () => {
describe('swipeGesture', () => {
it('calls the callback on a successful swipe', () => {
let swiped = false
const callback = () => { swiped = true }
const gesture = GestureService.swipeGesture(
GestureService.DIRECTION_RIGHT,
callback
)
GestureService.beginSwipe(mockTouchEvent(100, 100), gesture)
GestureService.updateSwipe(mockTouchEvent(200, 100), gesture)
expect(swiped).to.eql(true)
})
it('calls the callback only once per begin', () => {
let hits = 0
const callback = () => { hits += 1 }
const gesture = GestureService.swipeGesture(
GestureService.DIRECTION_RIGHT,
callback
)
GestureService.beginSwipe(mockTouchEvent(100, 100), gesture)
GestureService.updateSwipe(mockTouchEvent(150, 100), gesture)
GestureService.updateSwipe(mockTouchEvent(200, 100), gesture)
expect(hits).to.eql(1)
})
it('doesn\'t call the callback on an opposite swipe', () => {
let swiped = false
const callback = () => { swiped = true }
const gesture = GestureService.swipeGesture(
GestureService.DIRECTION_RIGHT,
callback
)
GestureService.beginSwipe(mockTouchEvent(100, 100), gesture)
GestureService.updateSwipe(mockTouchEvent(0, 100), gesture)
expect(swiped).to.eql(false)
})
it('doesn\'t call the callback on a swipe below threshold', () => {
let swiped = false
const callback = () => { swiped = true }
const gesture = GestureService.swipeGesture(
GestureService.DIRECTION_RIGHT,
callback,
100
)
GestureService.beginSwipe(mockTouchEvent(100, 100), gesture)
GestureService.updateSwipe(mockTouchEvent(150, 100), gesture)
expect(swiped).to.eql(false)
})
it('doesn\'t call the callback on a perpendicular swipe', () => {
let swiped = false
const callback = () => { swiped = true }
const gesture = GestureService.swipeGesture(
GestureService.DIRECTION_RIGHT,
callback,
30,
0.5
)
GestureService.beginSwipe(mockTouchEvent(100, 100), gesture)
GestureService.updateSwipe(mockTouchEvent(150, 200), gesture)
expect(swiped).to.eql(false)
})
it('calls the callback on perpendicular swipe if within tolerance', () => {
let swiped = false
const callback = () => { swiped = true }
const gesture = GestureService.swipeGesture(
GestureService.DIRECTION_RIGHT,
callback,
30,
2.0
)
GestureService.beginSwipe(mockTouchEvent(100, 100), gesture)
GestureService.updateSwipe(mockTouchEvent(150, 150), gesture)
expect(swiped).to.eql(true)
})
it('works with any arbitrary 2d directions', () => {
let swiped = false
const callback = () => { swiped = true }
const gesture = GestureService.swipeGesture(
[-1, -1],
callback,
30,
0.1
)
GestureService.beginSwipe(mockTouchEvent(100, 100), gesture)
GestureService.updateSwipe(mockTouchEvent(60, 60), gesture)
expect(swiped).to.eql(true)
})
})
})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment