Guest User

Untitled

a guest
May 30th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.28 KB | None | 0 0
  1. require 'curses'
  2. require 'test/unit'
  3.  
  4. class Gravity
  5. attr_accessor :gravity
  6.  
  7. None = 0
  8. Center = 1
  9. Top = 2
  10. Left = 3
  11. Right = 4
  12. Bottom = 5
  13. TopLeft = 6
  14. TopRight = 7
  15. BottomLeft = 8
  16. BottomRight = 9
  17.  
  18. def initialize(gravity = Gravity::None)
  19. @gravity = gravity
  20. end
  21.  
  22. def to_s
  23. case @gravity
  24. when None
  25. return "NoneGravity"
  26. when Center
  27. return "CenterGravity"
  28. when Top
  29. return "TopGravity"
  30. when Left
  31. return "LeftGravity"
  32. when Right
  33. return "RightGravity"
  34. when Bottom
  35. return "BottomGravity"
  36. when TopLeft
  37. return "TopLeftGravity"
  38. when TopRight
  39. return "TopRightGravity"
  40. when BottomLeft
  41. return "BottomLeftGravity"
  42. when BottomRight
  43. return "BottomRightGravity"
  44. end
  45. end
  46.  
  47. def ==(other)
  48. @gravity == other.gravity
  49. end
  50. end
  51.  
  52. class Border
  53. attr_accessor :left, :right, :top, :bottom, :titlebar_height
  54.  
  55. def initialize(left, right, top, bottom, titlebar_height)
  56. @left = left
  57. @right = right
  58. @top = top
  59. @bottom = bottom
  60. @titlebar_height = titlebar_height
  61. end
  62.  
  63. def width
  64. left + right
  65. end
  66.  
  67. def height
  68. top + titlebar_height + bottom
  69. end
  70. end
  71.  
  72. class Size
  73. attr_accessor :width
  74. attr_accessor :height
  75.  
  76. def initialize(width, height)
  77. @width = width
  78. @height = height
  79. end
  80. end
  81.  
  82. class Point
  83. attr_accessor :x
  84. attr_accessor :y
  85.  
  86. def initialize(x, y)
  87. @x = x
  88. @y = y
  89. end
  90. end
  91.  
  92. def gravity(size, border, point)
  93. return Gravity.new(Gravity::None) if point.x >= size.width or point.y >= size.height
  94.  
  95. if point.x < border.left
  96. return Gravity.new(Gravity::TopLeft) if point.y < border.top + 10
  97. return Gravity.new(Gravity::BottomLeft) if point.y >= size.height - border.left - 10
  98. return Gravity.new(Gravity::Left)
  99. end
  100.  
  101. if point.x >= (size.width - border.right) - 10
  102. return Gravity.new(Gravity::TopRight) if point.y < border.top
  103. return Gravity.new(Gravity::BottomRight) if point.y >= size.height - border.bottom
  104. end
  105.  
  106. if point.x >= size.width - border.left
  107. return Gravity.new(Gravity::TopRight) if point.y < border.top + 10
  108. return Gravity.new(Gravity::BottomRight) if point.y >= size.height - border.left - 10
  109. return Gravity.new(Gravity::Right)
  110. end
  111.  
  112. if point.x < border.left + 10
  113. return Gravity.new(Gravity::TopLeft) if point.y < border.top
  114. return Gravity.new(Gravity::BottomLeft) if point.y >= size.height - border.bottom
  115. end
  116.  
  117. return Gravity.new(Gravity::Top) if point.y < border.top
  118. return Gravity.new(Gravity::Bottom) if point.y >= size.height - border.bottom
  119. return Gravity.new(Gravity::Center)
  120. end
  121.  
  122. def draw
  123. Curses::init_screen
  124. Curses::nl
  125. Curses::noecho
  126.  
  127. @border = Border.new(2, 2, 2, 2, 10)
  128. @size = Size.new(30, 30)
  129.  
  130. 0.upto(@size.width - 1) do |x|
  131. 0.upto(@size.height - 1) do |y|
  132. Curses::setpos(y, x)
  133.  
  134. if gravity(@size, @border, Point.new(x, y)) == Gravity.new(Gravity::Center)
  135. Curses::addstr " "
  136. elsif gravity(@size, @border, Point.new(x, y)) == Gravity.new(Gravity::TopLeft) or
  137. gravity(@size, @border, Point.new(x, y)) == Gravity.new(Gravity::TopRight) or
  138. gravity(@size, @border, Point.new(x, y)) == Gravity.new(Gravity::BottomLeft) or
  139. gravity(@size, @border, Point.new(x, y)) == Gravity.new(Gravity::BottomRight)
  140. Curses::addstr "+"
  141. else
  142. Curses::addstr "-"
  143. end
  144. end
  145. end
  146.  
  147. Curses::refresh
  148. Curses::getch
  149. Curses::close_screen
  150. end
  151.  
  152. draw
  153. exit
  154.  
  155. class TestGravity < Test::Unit::TestCase
  156. def setup
  157. @border = Border.new(2, 2, 2, 2, 10)
  158. @size = Size.new(30, 30)
  159. end
  160.  
  161. def test_edges
  162. assert gravity(@size, @border, Point.new(0, 0)) == Gravity.new(Gravity::TopLeft)
  163. assert gravity(@size, @border, Point.new(@size.width - 1, 0)) == Gravity.new(Gravity::TopRight)
  164. assert gravity(@size, @border, Point.new(0, @size.height - 1)) == Gravity.new(Gravity::BottomLeft)
  165. assert gravity(@size, @border, Point.new(@size.width - 1, @size.height - 1)) == Gravity.new(Gravity::BottomRight)
  166. end
  167.  
  168. def test_sides
  169. (10 + @border.top).upto(@size.height - 10 - @border.bottom - 1) do |y|
  170. assert gravity(@size, @border, Point.new(0, y)) == Gravity.new(Gravity::Left)
  171. end
  172.  
  173. (10 + @border.top).upto(@size.height - 10 - @border.bottom - 1) do |y|
  174. assert gravity(@size, @border, Point.new(@size.width - 1, y)) == Gravity.new(Gravity::Right)
  175. end
  176.  
  177. (@border.left + 10).upto(@size.width - 10 - @border.right - 1) do |x|
  178. assert gravity(@size, @border, Point.new(x, 0)) == Gravity.new(Gravity::Top)
  179. end
  180.  
  181. (@border.left + 10).upto(@size.width - 10 - @border.right - 1) do |x|
  182. assert gravity(@size, @border, Point.new(x, @size.height - 1)) == Gravity.new(Gravity::Bottom)
  183. end
  184. end
  185.  
  186. def test_topleft
  187. 0.upto(@border.left + 10 - 1) do |x|
  188. assert gravity(@size, @border, Point.new(x, 0)) == Gravity.new(Gravity::TopLeft)
  189. end
  190.  
  191. 0.upto(@border.top + 10 - 1) do |y|
  192. assert gravity(@size, @border, Point.new(0, y)) == Gravity.new(Gravity::TopLeft)
  193. end
  194. end
  195.  
  196. def test_topright
  197. (@size.width - 10 - @border.right).upto(@size.width - 1) do |x|
  198. assert gravity(@size, @border, Point.new(x, 0)) == Gravity.new(Gravity::TopRight)
  199. end
  200.  
  201. 0.upto(@border.top + 10 - 1) do |y|
  202. assert gravity(@size, @border, Point.new(@size.width - 1, y)) == Gravity.new(Gravity::TopRight)
  203. end
  204. end
  205. end
Add Comment
Please, Sign In to add comment