MonkeyResult = -> that = {} options = null that.configure = (opts) -> options = opts options.image_size_rate = opts.image_size_rate || 1 that that.draw = -> ir = options.image_size_rate for log, i in options.log_list do (log, i) -> text_div = $('#'+options.text_prefix+'-'+i) text_div.html(log.message + "
"+log.timestamp) img = new Image() img.addEventListener "load", -> element = $('#'+options.view_prefix+'-'+i) canvas = element[0] canvas.width = img.width * ir canvas.height = img.height * ir context = canvas.getContext('2d') context.scale(1,1) context.clearRect(0,0,canvas.width, canvas.height) context.drawImage(img, 0, 0, canvas.width, canvas.height) target = DrawTarget(canvas: canvas, context: context, image_size_rate: ir, index: i) eval(log.message) img.src = log.screen_image + '.png' return that DrawTarget = (opts) -> that = {} options = opts canvas = options.canvas context = options.context ir = options.image_size_rate context.strokeStyle = "#f00" context.lineWidth = 2 arc_radius = 20 that.tapWithOptions = (p1, info) -> console.log(opts.index, p1, info) pos_to_number(p1) tc = 1*info.touchCount for num in [0..(tc-1)] o = x: (context.lineWidth + 2)*(num - (tc-1)/2), y: 0 draw_arc({x: (p1.x*ir + o.x)/ir, y: (p1.y*ir + o.y)/ir}, r: 0.1) for num in [0..(1*info.tapCount-1)] draw_arc(p1, r: (arc_radius*ir + (1+context.lineWidth)*num)/ir) that.pinchCloseFromToForDuration = (p1, p2, info) -> pos_to_number(p) for p in [p1, p2] draw_arc(p1) draw_arc(p2) # center = x: (p1.x+p2.x)/2, y: (p1.y+p2.y)/2 draw_arrow(p1, center) draw_arrow(p2, center) that.pinchOpenFromToForDuration = (p1, p2, info) -> pos_to_number(p) for p in [p1, p2] draw_arc(p1) draw_arc(p2) # center = x: (p1.x+p2.x)/2, y: (p1.y+p2.y)/2 draw_arrow(center, p1) draw_arrow(center, p2) that.dragFromToForDuration = (p1, p2, info) -> pos_to_number(p) for p in [p1, p2] console.log(opts.index, p1, p2, info) draw_arc(p1) draw_arc(p2) draw_arrow(p1, p2) that.flickFromTo = (p1, p2, info) -> pos_to_number(p) for p in [p1, p2] console.log(opts.index, p1, p2, info) draw_arc(p1) draw_arrow(p1, p2) that.lockForDuration = (duration) -> draw_text("Lock Screen #{Math.floor(duration * 100)/100} Secs.") that.deactivateAppForDuration = (duration) -> draw_text("Deactivate #{Math.floor(duration * 100)/100} Secs.") that.setDeviceOrientation = (orientation) -> draw_text("Orientation to #{orientation_name(orientation)}") that.shake = -> draw_text("Shake!") that.clickVolumeUp = -> draw_text("clickVolumeUp!") that.clickVolumeDown = -> draw_text("clickVolumeDown!") draw_text = (text, opts={}) -> context.font = "10px 'MS Pゴシック'" context.lineWidth = 1 context.strokeStyle = "green" context.beginPath() context.fillRect(canvas.width*0.1, 20, canvas.width*0.8, 40) context.stroke() context.strokeText(text, canvas.width*0.13, 42) orientation_name = (orientation) -> # http://www.testmachine.ch/javadoc/constant-values.html#ch.sukha.testmachine.client.IosDebuggingInterface.UIA_DEVICE_ORIENTATION_FACEDOWN switch 1 * orientation when 0 then "UNKNOWN" when 1 then "PORTRAIT" when 2 then "PORTRAIT_UPSIDEDOWN" when 3 then "LANDSCAPELEFT" when 4 then "LANDSCAPERIGHT" when 5 then "FACEUP" when 6 then "FACEDOWN" else "UNDEF" pos_to_number = (p) -> p.x = 1 * p.x p.y = 1 * p.y p draw_arc = (p, opts={}) -> radius = opts.r || arc_radius context.beginPath() context.arc(p.x * ir, p.y * ir, radius * ir, 0, Math.PI*2) context.stroke() draw_arrow = (p1, p2, opts={}) -> vx = p2.x - p1.x vy = p2.y - p1.y v = Math.sqrt(vx*vx + vy*vy) ux = vx/v uy = vy/v opts.w ||= 8 opts.h ||= 12 opts.h2 ||= 5 lp = {x: p2.x - uy * opts.w - ux * opts.h, y: p2.y + ux * opts.w - uy * opts.h} rp = {x: p2.x + uy * opts.w - ux * opts.h, y: p2.y - ux * opts.w - uy * opts.h} mp = {x: p2.x - ux * opts.h2, y: p2.y - uy * opts.h2} context.beginPath() context.moveTo(p1.x * ir, p1.y * ir) context.lineTo(mp.x * ir, mp.y * ir) context.lineTo(lp.x * ir, lp.y * ir) context.lineTo(p2.x * ir, p2.y * ir) context.lineTo(rp.x * ir, rp.y * ir) context.lineTo(mp.x * ir, mp.y * ir) context.stroke() return that window.MonkeyResult = MonkeyResult