Best Python code snippet using autotest_python
coordsys.py
Source:coordsys.py
...35 return hash(self.coords)36 def __add__(self, other):37 if not isinstance(other, tuple):38 other = other.coords39 return self.__class__(40 tuple(self.coords[i] + other[i] for i in range(len(self.coords))))41 def __neg__(self):42 return self.__class__(43 tuple(-self.coords[i] for i in range(len(self.coords))))44 def __sub__(self, other):45 if not isinstance(other, tuple):46 other = other.coords47 return self.__class__(48 tuple(self.coords[i] - other[i] for i in range(len(self.coords))))49 def __cmp__(self, other):50 if isinstance(other, tuple):51 return cmp(self.coords, other)52 else:53 return cmp(self.coords, other.coords)54 def add_modulo(self, other, moduli):55 if not isinstance(other, tuple):56 other = other.coords57 return self.__class__(58 tuple((self.coords[i] + other[i]) % (modulus or sys.maxint)59 for i, modulus in enumerate(moduli)))60class CartesianCoordinates(CoordinateSystem):61 pass62class Cartesian1D(CartesianCoordinates):63 """1D coordinate system: (x)"""64 rotation_steps = None65 rotation_axes = None66 flippable = True67 def flip0(self):68 """Flip on last dimension, about origin"""69 return self.__class__(self.coords[:-1] + (-self.coords[-1],))70 def flip(self, pivot):71 """Flip about pivot"""72 temp = self - pivot73 return temp.flip0() + pivot74class Cartesian2D(Cartesian1D):75 """2D coordinate system: (x, y)"""76 rotation_steps = 477 rotation_axes = None78 flippable = True79 def rotate0(self, quadrants):80 """Rotate about (0,0)"""81 x = self.coords[quadrants % 2] * (-2 * ((quadrants + 1) // 2 % 2) + 1)82 y = self.coords[(quadrants + 1) % 2] * (-2 * (quadrants // 2 % 2) + 1)83 return self.__class__((x, y))84 def rotate(self, quadrants, pivot):85 """Rotate about pivot"""86 temp = self - pivot87 return temp.rotate0(quadrants) + pivot88 def neighbors(self):89 """Return a list of adjacent cells."""90 x, y = self.coords91 # counterclockwise from right92 return (self.__class__((x + 1, y)), # right93 self.__class__((x, y + 1)), # above94 self.__class__((x - 1, y)), # left95 self.__class__((x, y - 1))) # below96class Cartesian3D(Cartesian2D):97 """3D coordinate system: (x, y, z)"""98 rotation_steps = 499 rotation_axes = 3100 flippable = True101 def rotate0(self, quadrants, axis):102 """Rotate about (0,0,0); `axis` is 0/x, 1/y, 2/z."""103 rotated = Cartesian2D((self.coords[(axis + 1) % 3],104 self.coords[(axis + 2) % 3])).rotate0(quadrants)105 result = (self.coords[axis],) + tuple(rotated)106 return self.__class__(result[-axis:] + result[:-axis])107 def rotate(self, quadrants, axis, pivot):108 """Rotate about pivot"""109 temp = self - pivot110 return temp.rotate0(quadrants, axis) + pivot111 def flip0(self, axis):112 """Flip axis (180 degree rotation), about 0"""113 return self.rotate0(2, (axis + 1) % 3)114 def flip(self, axis, pivot):115 """Flip axis (180 degree rotation about next axis) about pivot"""116 temp = self - pivot117 return temp.flip0(axis) + pivot118 def neighbors(self):119 """Return a list of adjacent cells."""120 x, y, z = self.coords121 return (self.__class__((x + 1, y, z)), # right122 self.__class__((x - 1, y, z)), # left123 self.__class__((x, y + 1, z)), # above124 self.__class__((x, y - 1, z)), # below125 self.__class__((x, y, z + 1)), # in front126 self.__class__((x, y, z - 1))) # behind127class CoordinateSet(set):128 """Generic set of coordinates."""129 def __init__(self, coord_list):130 converted = [self.coord_class(c) for c in coord_list]131 self.update(converted)132 def rotate0(self, *args):133 return self.__class__([coord.rotate0(*args) for coord in self])134 def rotate(self, *args):135 return self.__class__([coord.rotate(*args) for coord in self])136 def flip0(self, *args):137 return self.__class__([coord.flip0(*args) for coord in self])138 def flip(self, *args):139 return self.__class__([coord.flip(*args) for coord in self])140 def translate(self, offset, moduli=None):141 """Move coordSet by offset"""142 new = self.__class__(list(self))143 new._itranslate(offset, moduli)144 return new145 def _itranslate(self, offset, moduli=None):146 """Move coordSet by offset, in place"""147 if isinstance(offset, tuple):148 offset = self.coord_class(offset)149 if moduli:150 newset = [coord.add_modulo(offset, moduli) for coord in self]151 else:152 newset = [coord + offset for coord in self]153 self.clear()154 self.update(newset)155class Cartesian1DCoordSet(CoordinateSet):156 """1 dimensional unit-cell coordinate set"""157 coord_class = Cartesian1D158class Cartesian2DCoordSet(CoordinateSet):159 """2 dimensional square-cell coordinate set"""160 coord_class = Cartesian2D161 def orient2D(self, rotation=0, flip=0):162 """163 Transform (rotate, flip) the coordinate set according to parameters.164 """165 if not (rotation == 0 and flip == 0):166 newSet = []167 for c in self:168 if flip:169 c = c.flip0()170 newSet.append(c.rotate0(rotation))171 self.clear()172 self.update(newSet)173class Cartesian3DCoordSet(CoordinateSet):174 """3 dimensional cube-cell coordinate set"""175 coord_class = Cartesian3D176 def orient3D(self, rotation=0, axis=0, flip=0):177 """178 Transform (rotate, flip) the coordinate set according to parameters.179 """180 if not (rotation == 0 and flip == 0):181 newSet = []182 for c in self:183 if flip:184 c = c.flip0((axis + 1) % 3)185 newSet.append(c.rotate0(rotation, axis))186 self.clear()187 self.update(newSet)188class Cartesian2DView(Cartesian2DCoordSet):189 """190 2 dimensional (+,+)-quadrant square-cell coordinate set with bounds191 """192 def __init__(self, coord_list, rotation=0, flip=0, axis=None):193 Cartesian2DCoordSet.__init__(self, coord_list)194 # transform self under aspect:195 self.orient2D(rotation, flip)196 offset, self.bounds = self.calculate_offset_and_bounds()197 # move coordSet to top-left at (0,0)198 self._itranslate(-offset)199 def __hash__(self):200 return hash(tuple(sorted(self)))201 def calculate_offset_and_bounds(self):202 rowvals = [c[0] for c in self]203 colvals = [c[1] for c in self]204 offset = self.coord_class((min(rowvals), min(colvals)))205 maxvals = self.coord_class((max(rowvals), max(colvals)))206 bounds = maxvals - offset207 return offset, bounds208class Cartesian3DView(Cartesian3DCoordSet):209 """210 3 dimensional (+,+,+)-quadrant square-cell coordinate set with bounds211 """212 def __init__(self, coord_list, rotation=0, axis=0, flip=0):213 Cartesian3DCoordSet.__init__(self, coord_list)214 # transform self under aspect:215 self.orient3D(rotation, axis, flip)216 offset, self.bounds = self.calculate_offset_and_bounds()217 # move coordSet to top-left at (0,0,0)218 self._itranslate(-offset)219 def __hash__(self):220 return hash(tuple(sorted(self)))221 def calculate_offset_and_bounds(self):222 rows = [c[0] for c in self]223 cols = [c[1] for c in self]224 layers = [c[2] for c in self]225 offset = self.coord_class((min(rows), min(cols), min(layers)))226 maxvals = self.coord_class((max(rows), max(cols), max(layers)))227 bounds = maxvals - offset228 return offset, bounds229class CartesianPseudo3DView(Cartesian3DView):230 """The Z dimension is used for direction/orientation."""231 def calculate_offset_and_bounds(self):232 rows = [c[0] for c in self]233 cols = [c[1] for c in self]234 layers = [c[2] for c in self]235 # keep Z-offset at 0 to keep Z values unaltered:236 offset = self.coord_class((min(rows), min(cols), 0))237 maxvals = self.coord_class((max(rows), max(cols), max(layers)))238 bounds = maxvals - offset239 return offset, bounds240class SquareGrid3D(Cartesian3D):241 """242 Pseudo-3D (2D + orientation) square coordinate system for gridlines: (x,243 y, z). The Z dimension is for orientation: z==0 for horizontal line244 segments (from (x,y) to (x+1,y)), and z==1 for vertical line segments245 (from (x,y) to (x,y+1)). The Z value indicates the index of the dimension246 to increment.247 """248 rotation_steps = 4249 rotation_axes = None250 flippable = True251 def flip0(self, axis=None):252 """253 Flip about y-axis::254 x_new = -x + z - 1255 y_new = y256 z_new = z257 The `axis` parameter is ignored.258 """259 return self.__class__(260 ((-self.coords[0] + self.coords[2] - 1),261 self.coords[1],262 self.coords[2]))263 rotation_coefficients = {264 0: (( 1, 0, 0, 0), ( 0, 1, 0, 0), ( 0, 0, 1, 0)),265 1: (( 0, -1, -1, 0), ( 1, 0, 0, 0), ( 0, 0, -1, 1)),266 2: ((-1, 0, 1, -1), ( 0, -1, -1, 0), ( 0, 0, 1, 0)),267 3: (( 0, 1, 0, 0), (-1, 0, 1, -1), ( 0, 0, -1, 1)),}268 """Pre-computed matrix for rotation by *n* 90-degree steps.269 Mapping of rotation unit (step) to coefficients matrix:270 ((x, y, z, 1) for x, (x, y, z, 1) for y, (x, y, z, 1) for z)."""271 def rotate0(self, steps, axis=None):272 """273 Rotate about (0,0). For each 90-degree increment (step)::274 x_new = -y - z275 y_new = x276 z_new = 1 - z277 The `self.rotation_coefficients` matrix is used rather than repeated278 applications of the above rule. The `axis` parameter is ignored.279 """280 coeffs = self.rotation_coefficients[steps]281 x = (coeffs[0][3]282 + coeffs[0][0] * self.coords[0]283 + coeffs[0][1] * self.coords[1]284 + coeffs[0][2] * self.coords[2])285 y = (coeffs[1][3]286 + coeffs[1][0] * self.coords[0]287 + coeffs[1][1] * self.coords[1]288 + coeffs[1][2] * self.coords[2])289 z = (coeffs[2][3]290 + coeffs[2][0] * self.coords[0]291 + coeffs[2][1] * self.coords[1]292 + coeffs[2][2] * self.coords[2])293 return self.__class__((x, y, z))294 def neighbors(self):295 """Return a list of adjacent cells."""296 x, y, z = self.coords297 # counterclockwise from right298 if z == 0:299 return (self.__class__((x + 1, y, 0)), # right, 1 right300 self.__class__((x + 1, y, 1)), # up, 1 right301 self.__class__((x, y, 1)), # up302 self.__class__((x - 1, y, 0)), # left303 self.__class__((x, y - 1, 1)), # down304 self.__class__((x + 1, y - 1, 1))) # down, 1 right305 else:306 return (self.__class__((x, y, 0)), # right307 self.__class__((x, y + 1, 0)), # right, 1 up308 self.__class__((x, y + 1, 1)), # up, 1 up309 self.__class__((x - 1, y + 1, 0)), # left, 1 up310 self.__class__((x - 1, y, 0)), # left311 self.__class__((x, y - 1, 1))) # down312class SquareGrid3DCoordSetMixin:313 """314 Attributes and methods for pseudo-3-dimensional square grid coordinate set.315 """316 coord_class = SquareGrid3D317 intersection_coord_class = Cartesian2D318 def intersections(self):319 coords = set()320 for (x,y,z) in self:321 if self.coord_class((x + (z == 0), y + (z == 1), z)) in self:322 coords.add(self.intersection_coord_class(323 (x + (z == 0), y + (z == 1))))324 return coords325class SquareGrid3DCoordSet(SquareGrid3DCoordSetMixin, Cartesian3DCoordSet):326 """Pseudo-3-dimensional square grid coordinate set."""327 pass328class SquareGrid3DView(SquareGrid3DCoordSetMixin, CartesianPseudo3DView):329 """330 Pseudo-3-dimensional (+x,+y)-quadrant square grid coordinate set with331 bounds332 """333 pass334class QuasiSquareGrid3D(SquareGrid3D):335 """336 Same as SquareGrid3D, except that calls to .neighbors() also return337 disconnected quasi-neighbors.338 """339 def neighbors(self):340 """Return a list of adjacent and quasi-adjacent cells."""341 adjacent = SquareGrid3D.neighbors(self)342 x, y, z = self.coords343 # counterclockwise from right344 if z == 0:345 return adjacent + (346 self.__class__((x , y + 1, 0)),347 self.__class__((x , y + 1, 1)),348 self.__class__((x - 1, y + 1, 0)),349 self.__class__((x - 1, y , 1)),350 self.__class__((x - 2, y , 0)),351 self.__class__((x - 1, y - 1, 1)),352 self.__class__((x - 1, y - 1, 0)),353 self.__class__((x , y - 2, 1)),354 self.__class__((x , y - 1, 0)),355 self.__class__((x + 1, y - 2, 1)),356 self.__class__((x + 1, y - 1, 0)),357 self.__class__((x + 2, y - 1, 1)),358 self.__class__((x + 2, y , 0)),359 self.__class__((x + 2, y , 1)),360 self.__class__((x + 1, y + 1, 0)),361 self.__class__((x + 1, y + 1, 1)),)362 else:363 return adjacent + (364 self.__class__((x - 1, y , 1)),365 self.__class__((x - 2, y , 0)),366 self.__class__((x - 1, y - 1, 1)),367 self.__class__((x - 1, y - 1, 0)),368 self.__class__((x , y - 2, 1)),369 self.__class__((x , y - 1, 0)),370 self.__class__((x + 1, y - 1, 1)),371 self.__class__((x + 1, y , 0)),372 self.__class__((x + 1, y , 1)),373 self.__class__((x + 1, y + 1, 0)),374 self.__class__((x + 1, y + 1, 1)),375 self.__class__((x , y + 2, 0)),376 self.__class__((x , y + 2, 1)),377 self.__class__((x - 1, y + 2, 0)),378 self.__class__((x - 1, y + 1, 1)),379 self.__class__((x - 2, y + 1, 0)),)380class QuasiSquareGrid3DCoordSet(SquareGrid3DCoordSet):381 coord_class = QuasiSquareGrid3D382class QuasiSquareGrid3DView(SquareGrid3DView):383 coord_class = QuasiSquareGrid3D384class Hexagonal2D(Cartesian2D):385 """386 2D hexagonal coordinate system: (x, y).387 The x and y axes are not perpendicular, but separated by 60 degrees::388 __389 __/ \390 __/ \__/391 __/ \__/ \392 __/ \__/ \__/393 / \__/ \__/ \394 4\__/ \__/ \__/395 / \__/ \__/ \396 3\__/ \__/ \__/397 / \__/ \__/ \398 2\__/ \__/ \__/399 / \__/ \__/ 4400 1\__/ \__/ 3401 / \__/ 2402 y=0\__/ 1403 x=0404 The x-axis could also be considered horizontal, with the y-axis slanted up405 and to the right, but the representation above is easier to draw in ASCII.406 """407 rotation_steps = 6408 rotation_axes = None409 flippable = True410 def flip0(self):411 """412 Flip about y-axis::413 x_new = -x414 y_new = x + y415 """416 return self.__class__((-self.coords[0],417 self.coords[1] + self.coords[0]))418 rotation_coefficients = {419 0: (( 1, 0), ( 0, 1)),420 1: (( 0, -1), ( 1, 1)),421 2: ((-1, -1), ( 1, 0)),422 3: ((-1, 0), ( 0, -1)),423 4: (( 0, 1), (-1, -1)),424 5: (( 1, 1), (-1, 0))}425 """Pre-computed matrix for rotation by *n* 60-degree steps.426 Mapping of rotation unit (step) to coefficients matrix:427 ((x, y) for x, (x, y) for y)."""428 def rotate0(self, steps):429 """430 Rotate about (0,0). For each 60-degree increment (step)::431 x_new = -y432 y_new = x + y433 The `self.rotation_coefficients` matrix is used rather than repeated434 applications of the above rule.435 """436 coeffs = self.rotation_coefficients[steps]437 x = coeffs[0][0] * self.coords[0] + coeffs[0][1] * self.coords[1]438 y = coeffs[1][0] * self.coords[0] + coeffs[1][1] * self.coords[1]439 return self.__class__((x, y))440 def neighbors(self):441 """Return a list of adjacent cells."""442 x, y = self.coords443 # counterclockwise from right444 return (self.__class__((x + 1, y)), # right445 self.__class__((x, y + 1)), # above-right446 self.__class__((x - 1, y + 1)), # above-left447 self.__class__((x - 1, y)), # left448 self.__class__((x, y - 1)), # below-left449 self.__class__((x + 1, y - 1))) # below-right450class Hexagonal2DCoordSet(Cartesian2DCoordSet):451 """2 dimensional hex coordinate set"""452 coord_class = Hexagonal2D453class Hexagonal2DView(Cartesian2DView):454 """455 2 dimensional (+,+)-quadrant hex-cell coordinate set with bounds456 """457 coord_class = Hexagonal2D458class Triangular3D(Cartesian3D):459 """460 Pseudo-3D (2D + orientation) triangular coordinate system: (x, y, z).461 The x and y axes are not perpendicular, but separated by 60 degrees::462 ____________________463 /\ /\ /\ /\ /\ /464 4/__\/__\/__\/__\/__\/465 /\ /\ /\ /\ /\ /466 3/__\/__\/__\/__\/__\/467 /\ /\ /\ /\ /\ /468 2/__\/__\/__\/__\/__\/469 /\ /\ /\ /\ /\ /470 1/__\/__\/__\/__\/__\/ ____471 /\ /\ /\ /\ /\ / /\ \ /472 y=0/__\/__\/__\/__\/__\/ z=0/__\ z=1\/473 x=0 1 2 3 4474 """475 rotation_steps = 6476 rotation_axes = None477 flippable = True478 def flip0(self, axis=None):479 """480 Flip about y-axis::481 x_new = -(x + y + z)482 y_new = y483 z_new = z484 The `axis` parameter is ignored.485 """486 return self.__class__(487 (-(self.coords[0] + self.coords[1] + self.coords[2]),488 self.coords[1],489 self.coords[2]))490 rotation_coefficients = {491 0: (( 1, 0, 0, 0), ( 0, 1, 0, 0), ( 0, 0, 1, 0)),492 1: (( 0, -1, 0, -1), ( 1, 1, 1, 0), ( 0, 0, -1, 1)),493 2: ((-1, -1, -1, -1), ( 1, 0, 0, 0), ( 0, 0, 1, 0)),494 3: ((-1, 0, 0, -1), ( 0, -1, 0, -1), ( 0, 0, -1, 1)),495 4: (( 0, 1, 0, 0), (-1, -1, -1, -1), ( 0, 0, 1, 0)),496 5: (( 1, 1, 1, 0), (-1, 0, 0, -1), ( 0, 0, -1, 1)),}497 """Pre-computed matrix for rotation by *n* 60-degree steps.498 Mapping of rotation unit (step) to coefficients matrix:499 ((x, y, z, 1) for x, (x, y, z, 1) for y, (x, y, z, 1) for z)."""500 def rotate0(self, steps, axis=None):501 """502 Rotate about (0,0). For each 60-degree increment (step)::503 x_new = -y - 1504 y_new = x + y + z505 z_new = 1 - z506 The `self.rotation_coefficients` matrix is used rather than repeated507 applications of the above rule. The `axis` parameter is ignored.508 """509 coeffs = self.rotation_coefficients[steps]510 x = (coeffs[0][3]511 + coeffs[0][0] * self.coords[0]512 + coeffs[0][1] * self.coords[1]513 + coeffs[0][2] * self.coords[2])514 y = (coeffs[1][3]515 + coeffs[1][0] * self.coords[0]516 + coeffs[1][1] * self.coords[1]517 + coeffs[1][2] * self.coords[2])518 z = (coeffs[2][3]519 + coeffs[2][0] * self.coords[0]520 + coeffs[2][1] * self.coords[1]521 + coeffs[2][2] * self.coords[2])522 return self.__class__((x, y, z))523 def neighbors(self):524 """Return a list of adjacent cells."""525 x, y, z = self.coords526 # counterclockwise from right527 if z == 0:528 return (self.__class__((x, y, 1)), # right529 self.__class__((x - 1, y, 1)), # left530 self.__class__((x, y - 1, 1))) # below531 else:532 return (self.__class__((x + 1, y, 0)), # right533 self.__class__((x, y + 1, 0)), # above534 self.__class__((x, y, 0))) # left535class Triangular3DCoordSet(Cartesian3DCoordSet):536 """Pseudo-3-dimensional triangular coordinate set."""537 coord_class = Triangular3D538class Triangular3DView(CartesianPseudo3DView):539 """540 Pseudo-3-dimensional (+x,+y)-quadrant triangle-cell coordinate set with541 bounds.542 """543 coord_class = Triangular3D544class TriangularGrid3D(Cartesian3D):545 """546 Pseudo-3D (2D + orientation) triangular coordinate system for gridlines:547 (x, y, z). The Z dimension is for orientation:548 == ========== ==============================549 z (x, y) to direction550 == ========== ==============================551 0 (x+1, y) 0°, horizontal, to the right552 1 (x, y+1) 60°, up & to the right553 2 (x-1, y+1) 120°, up & to the left554 == ========== ==============================555 Visually::556 z=2 z=1557 \ /558 \/___ z=0559 (x,y)560 """561 rotation_steps = 6562 rotation_axes = None563 flippable = True564 def flip0(self, axis=None):565 """566 Flip about y-axis::567 x1 = -x0568 y1 = x0 + y0569 z1 = 2 - z0570 The `axis` parameter is ignored.571 """572 return self.__class__(573 (-self.coords[0],574 self.coords[0] + self.coords[1],575 2 - self.coords[2]))576 def rotate0(self, steps, axis=None):577 """578 Rotate about (0,0). For each 60-degree increment (step)::579 x1 = -y0 - ((z0 + 1) // 3)580 y1 = x0 + y0581 z1 = (z0 + 1) % 3582 The `axis` parameter is ignored.583 """584 x1, y1, z1 = self.coords585 for i in range(steps):586 x0, y0, z0 = x1, y1, z1587 x1 = -y0 - int((z0 + 1) / 3)588 y1 = x0 + y0589 z1 = (z0 + 1) % 3590 return self.__class__((x1, y1, z1))591 def neighbors(self):592 """593 Return a list of adjacent cells, counterclockwise from segment, first594 around the origin point then around the endpoint.595 """596 x, y, z = self.coords597 if z == 0:598 return (self.__class__((x , y, 1)),599 self.__class__((x, y, 2)),600 self.__class__((x - 1, y, 0)),601 self.__class__((x, y - 1, 1)),602 self.__class__((x + 1, y - 1, 2)),603 self.__class__((x + 1, y - 1, 1)),604 self.__class__((x + 2, y - 1, 2)),605 self.__class__((x + 1, y, 0)),606 self.__class__((x + 1, y, 1)),607 self.__class__((x + 1, y, 2)))608 elif z == 1:609 return (self.__class__((x, y, 2)),610 self.__class__((x - 1, y, 0)),611 self.__class__((x, y - 1, 1)),612 self.__class__((x + 1, y - 1, 2)),613 self.__class__((x, y, 0)),614 self.__class__((x + 1, y, 2)),615 self.__class__((x, y + 1, 0)),616 self.__class__((x, y + 1, 1)),617 self.__class__((x, y + 1, 2)),618 self.__class__((x - 1, y + 1, 0)))619 elif z == 2:620 return (self.__class__((x - 1, y, 0)),621 self.__class__((x, y - 1, 1)),622 self.__class__((x + 1, y - 1, 2)),623 self.__class__((x, y, 0)),624 self.__class__((x, y, 1)),625 self.__class__((x - 1, y + 1, 0)),626 self.__class__((x - 1, y + 1, 1)),627 self.__class__((x - 1, y + 1, 2)),628 self.__class__((x - 2, y + 1, 0)),629 self.__class__((x - 1, y, 1)))630 endpoint_deltas = {631 0: (+1, 0), # 0°, horizontal, to the right632 1: ( 0, +1), # 60°, up & to the right633 2: (-1, +1)} # 120°, up & to the left634 def endpoint(self):635 """636 Return the coordinates of the endpoint of this segment, a segment637 sharing this segment's direction.638 """639 x, y, z = self.coords640 delta_x, delta_y = self.endpoint_deltas[z]641 return self.__class__((x + delta_x, y + delta_y, z))642 def intersection_coordinates(self):643 """644 Return a list of coordinates of the intersection segments of the645 start- and end-points of this coordinate.646 """647 intersections = []648 for coord in (self, self.endpoint()):649 x, y, z = coord650 intersections.extend(self.__class__((x, y, z)) for z in range(6))651 return intersections652 @classmethod653 def point_neighbors(cls, x, y):654 """655 Return a list of segments which adjoin point (x,y), in656 counterclockwise order from 0-degrees right.657 """658 return [cls(coords) for coords in (659 (x, y, 0), (x, y, 1), (x, y, 2),660 (x-1, y, 0), (x, y-1, 1), (x+1, y-1, 2))]661class TriangularGrid3DCoordSetMixin:662 """663 Attributes and methods for pseudo-3-dimensional triangular grid coordinate664 set.665 """666 coord_class = TriangularGrid3D667 intersection_coord_class = TriangularGrid3D668 def intersections(self):669 """670 Represent contstraints on intersections via up to 6 additional columns671 per intersection [*]_, in the form i(x,y,z) (or "x,y,zi"). The672 segment in direction "z" (below) cannot go through the intersection673 (x,y)::674 2 1675 \ /676 3___\/___0677 /\678 / \679 4 5680 .. [*] Possibly fewer columns for intersections at the edge of a681 puzzle shape. This represents an optimization.682 Note that since there are already 3 line segments originating at683 each intersection, the cost of intersection constraints is 2 per684 segment, which effectively multiplies the number of coordinate685 columns by 3.686 Starting at 0°, rotating counter-clockwise::687 B / A688 ____/___ D ____ E ____ F ____689 / \690 C / D' \691 * A: 60° (adjacent), no constraints.692 * B: 120° (one-gapper). 3 constraints: 2 legs {1,3}, plus gap {2}.693 * C: 180° (two-gapper). 4 constraints: 2 legs {3,0}, plus gaps {4,5}.694 * D: 240° (three-gapper), no constraints. However, D' is a one-gapper695 (= B).696 * E: 300° (four-gapper), no constraints.697 * F: 360° (five-gapper), no constraints.698 Both ends of each segment must be checked, but only counter-clockwise699 (to avoid duplication).700 """701 icoords = set()702 for coord in self:703 neighbors = coord.neighbors()704 x, y, z = coord705 # start of segment: check that ccw-adjacent segment not there:706 if neighbors[0] not in self:707 if neighbors[1] in self:708 icoords.add(self.intersection_coord_class((x, y, z)))709 icoords.add(710 self.intersection_coord_class((x, y, (z + 1) % 6)))711 icoords.add(712 self.intersection_coord_class((x, y, (z + 2) % 6)))713 elif neighbors[2] in self:714 icoords.add(self.intersection_coord_class((x, y, z)))715 icoords.add(716 self.intersection_coord_class((x, y, (z + 1) % 6)))717 icoords.add(718 self.intersection_coord_class((x, y, (z + 2) % 6)))719 icoords.add(720 self.intersection_coord_class((x, y, (z + 3) % 6)))721 # end of segment: check that ccw-adjacent segment not there:722 if neighbors[5] not in self:723 # origin of end of segment:724 xo, yo, zo = neighbors[7 - z]725 if neighbors[6] in self:726 icoords.add(self.intersection_coord_class((xo, yo, z + 3)))727 icoords.add(728 self.intersection_coord_class((xo, yo, (z + 4) % 6)))729 icoords.add(730 self.intersection_coord_class((xo, yo, (z + 5) % 6)))731 elif neighbors[7] in self:732 icoords.add(self.intersection_coord_class((xo, yo, z + 3)))733 icoords.add(734 self.intersection_coord_class((xo, yo, (z + 4) % 6)))735 icoords.add(736 self.intersection_coord_class((xo, yo, (z + 5) % 6)))737 icoords.add(738 self.intersection_coord_class((xo, yo, z)))739 return icoords740class TriangularGrid3DCoordSet(TriangularGrid3DCoordSetMixin,741 Cartesian3DCoordSet):742 """Pseudo-3-dimensional triangular grid coordinate set."""743 pass744class TriangularGrid3DView(TriangularGrid3DCoordSetMixin,745 CartesianPseudo3DView):746 """747 Pseudo-3-dimensional (+x,+y)-quadrant triangular grid coordinate set with748 bounds.749 """750 def calculate_offset_and_bounds(self):751 xs = [c[0] for c in self]752 # include x-coordinates of endpoints when z==2:753 xs.extend([c.endpoint()[0] for c in self if c[2] == 2])754 ys = [c[1] for c in self]755 zs = [c[2] for c in self]756 # keep Z-offset at 0 to keep Z values unaltered:757 offset = self.coord_class((min(xs), min(ys), 0))758 maxvals = self.coord_class((max(xs), max(ys), max(zs)))759 bounds = maxvals - offset760 return offset, bounds761class QuasiTriangularGrid3D(TriangularGrid3D):762 """763 Same as TriangularGrid3D, except that calls to .neighbors() also return764 disconnected quasi-neighbors.765 """766 def neighbors(self):767 """768 Return a list of adjacent cells, counterclockwise from segment, first769 around the origin point then around the endpoint.770 """771 adjacent = TriangularGrid3D.neighbors(self)772 x, y, z = self.coords773 if z == 0:774 return adjacent + (775 self.__class__((x , y + 1, 0)),776 self.__class__((x , y + 1, 1)),777 self.__class__((x , y + 1, 2)),778 self.__class__((x - 1, y + 1, 0)),779 self.__class__((x - 1, y + 1, 1)),780 self.__class__((x - 1, y + 1, 2)),781 self.__class__((x - 2, y + 1, 0)),782 self.__class__((x - 1, y , 1)),783 self.__class__((x - 1, y , 2)),784 self.__class__((x - 2, y , 0)),785 self.__class__((x - 1, y - 1, 1)),786 self.__class__((x , y - 1, 2)),787 self.__class__((x - 1, y - 1, 0)),788 self.__class__((x , y - 2, 1)),789 self.__class__((x + 1, y - 2, 2)),790 self.__class__((x , y - 1, 0)),791 self.__class__((x + 1, y - 2, 1)),792 self.__class__((x + 2, y - 2, 2)),793 self.__class__((x + 1, y - 1, 0)),794 self.__class__((x + 2, y - 2, 1)),795 self.__class__((x + 3, y - 2, 2)),796 self.__class__((x + 2, y - 1, 0)),797 self.__class__((x + 2, y - 1, 1)),798 self.__class__((x + 3, y - 1, 2)),799 self.__class__((x + 2, y , 0)),800 self.__class__((x + 2, y , 1)),801 self.__class__((x + 2, y , 2)),802 self.__class__((x + 1, y + 1, 0)),803 self.__class__((x + 1, y + 1, 1)),804 self.__class__((x + 1, y + 1, 2)),)805 elif z == 1:806 return adjacent + (807 self.__class__((x - 1, y + 1, 1)),808 self.__class__((x - 1, y + 1, 2)),809 self.__class__((x - 2, y + 1, 0)),810 self.__class__((x - 1, y , 1)),811 self.__class__((x - 1, y , 2)),812 self.__class__((x - 2, y , 0)),813 self.__class__((x - 1, y - 1, 1)),814 self.__class__((x , y - 1, 2)),815 self.__class__((x - 1, y - 1, 0)),816 self.__class__((x , y - 2, 1)),817 self.__class__((x + 1, y - 2, 2)),818 self.__class__((x , y - 1, 0)),819 self.__class__((x + 1, y - 2, 1)),820 self.__class__((x + 2, y - 2, 2)),821 self.__class__((x + 1, y - 1, 0)),822 self.__class__((x + 1, y - 1, 1)),823 self.__class__((x + 2, y - 1, 2)),824 self.__class__((x + 1, y , 0)),825 self.__class__((x + 1, y , 1)),826 self.__class__((x + 2, y , 2)),827 self.__class__((x + 1, y + 1, 0)),828 self.__class__((x + 1, y + 1, 1)),829 self.__class__((x + 1, y + 1, 2)),830 self.__class__((x , y + 2, 0)),831 self.__class__((x , y + 2, 1)),832 self.__class__((x , y + 2, 2)),833 self.__class__((x - 1, y + 2, 0)),834 self.__class__((x - 1, y + 2, 1)),835 self.__class__((x - 1, y + 2, 2)),836 self.__class__((x - 2, y + 2, 0)),)837 elif z == 2:838 return adjacent + (839 self.__class__((x - 1, y , 2)),840 self.__class__((x - 2, y , 0)),841 self.__class__((x - 1, y - 1, 1)),842 self.__class__((x , y - 1, 2)),843 self.__class__((x - 1, y - 1, 0)),844 self.__class__((x , y - 2, 1)),845 self.__class__((x + 1, y - 2, 2)),846 self.__class__((x , y - 1, 0)),847 self.__class__((x + 1, y - 2, 1)),848 self.__class__((x + 2, y - 2, 2)),849 self.__class__((x + 1, y - 1, 0)),850 self.__class__((x + 1, y - 1, 1)),851 self.__class__((x + 2, y - 1, 2)),852 self.__class__((x + 1, y , 0)),853 self.__class__((x + 1, y , 1)),854 self.__class__((x + 1, y , 2)),855 self.__class__((x , y + 1, 0)),856 self.__class__((x , y + 1, 1)),857 self.__class__((x , y + 1, 2)),858 self.__class__((x - 1, y + 2, 0)),859 self.__class__((x - 1, y + 2, 1)),860 self.__class__((x - 1, y + 2, 2)),861 self.__class__((x - 2, y + 2, 0)),862 self.__class__((x - 2, y + 2, 1)),863 self.__class__((x - 2, y + 2, 2)),864 self.__class__((x - 3, y + 2, 0)),865 self.__class__((x - 2, y + 1, 1)),866 self.__class__((x - 2, y + 1, 2)),867 self.__class__((x - 3, y + 1, 0)),868 self.__class__((x - 2, y , 1)),)869class QuasiTriangularGrid3DCoordSet(TriangularGrid3DCoordSet):870 coord_class = QuasiTriangularGrid3D871class QuasiTriangularGrid3DView(TriangularGrid3DView):872 coord_class = QuasiTriangularGrid3D873class HexagonalGrid3D(Cartesian3D):874 """875 Pseudo-3D (2D + orientation) hexagonal coordinate system for gridlines:876 (x, y, z). (x, y) = lower-left corner of (x, y) hexagon in polyhex grid.877 The Z dimension is for orientation:878 == ========== ==============================879 z (x, y) to direction880 == ========== ==============================881 0 (x+1, y) 0°, horizontal, to the right882 1 (x, y+1) 120°, up & to the left883 2 (x-1, y) 240°, down & to the left884 == ========== ==============================885 Visually::886 z=1887 \888 \____z=0889 /890 /891 z=2892 """893 rotation_steps = 6894 rotation_axes = None895 flippable = True896 def flip0(self, axis=None):897 """898 Flip about y-axis (stack of hexes above origin)::899 == ====== ========= ========900 z x' = y' = z' =901 == ====== ========= ========902 0 -x x + y (-z) % 3903 1 -x + 1 '' ''904 2 '' x + y - 1 ''905 == ====== ========= ========906 The `axis` parameter is ignored.907 """908 x, y, z = self.coords909 x1 = -x + (z != 0)910 y1 = x + y - (z == 2)911 z1 = (-z) % 3912 return self.__class__((x1, y1, z1))913 def rotate0(self, steps, axis=None):914 """915 Rotate about (0,0). For each 60-degree increment (step)::916 == ====== ========= ===========917 z x' = y' = z' =918 == ====== ========= ===========919 0 -y + 1 x + y (z - 1) % 3920 1 -y '' ''921 2 -y + 1 x + y - 1 ''922 == ====== ========= ===========923 The `axis` parameter is ignored.924 """925 x1, y1, z1 = self.coords926 for i in range(steps):927 x0, y0, z0 = x1, y1, z1928 x1 = -y0 + (z0 != 1)929 y1 = x0 + y0 - (z0 == 2)930 z1 = (z0 - 1) % 3931 return self.__class__((x1, y1, z1))932 def neighbors(self):933 """934 Return a list of adjacent cells, counterclockwise from segment, first935 around the origin point then around the endpoint.936 """937 x, y, z = self.coords938 if z == 0:939 return (self.__class__((x , y, 1)),940 self.__class__((x, y, 2)),941 self.__class__((x + 1, y - 1, 1)),942 self.__class__((x + 1, y, 2)))943 elif z == 1:944 return (self.__class__((x, y, 2)),945 self.__class__((x, y, 0)),946 self.__class__((x, y + 1, 2)),947 self.__class__((x - 1, y + 1, 0)))948 elif z == 2:949 return (self.__class__((x, y, 0)),950 self.__class__((x, y, 1)),951 self.__class__((x - 1, y, 0)),952 self.__class__((x, y - 1, 1)))953class HexagonalGrid3DCoordSet(Cartesian3DCoordSet):954 """Pseudo-3-dimensional hexagonal grid coordinate set."""955 coord_class = HexagonalGrid3D956class HexagonalGrid3DView(CartesianPseudo3DView):957 """958 Pseudo-3-dimensional (+x,+y)-quadrant hexagonal grid coordinate set with959 bounds.960 """961 coord_class = HexagonalGrid3D962 def calculate_offset_and_bounds(self):963 xs = [c[0] for c in self]964 ys = [c[1] for c in self]965 zs = [c[2] for c in self]966 # keep Z-offset at 0 to keep Z values unaltered:967 offset = self.coord_class((min(xs), min(ys), 0))968 maxvals = self.coord_class((max(xs), max(ys), max(zs)))969 bounds = maxvals - offset970 return offset, bounds971class QuasiHexagonalGrid3D(HexagonalGrid3D):972 """973 Same as HexagonalGrid3D, except that calls to .neighbors() also return974 disconnected quasi-neighbors.975 """976 def neighbors(self):977 """978 Return a list of adjacent and quasi-adjacent cells, counterclockwise979 from segment, first around the origin point then around the endpoint.980 """981 adjacent = HexagonalGrid3D.neighbors(self)982 x, y, z = self.coords983 if z == 0:984 return adjacent + (985 self.__class__((x , y + 1, 2)),986 self.__class__((x - 1, y + 1, 0)),987 self.__class__((x - 1, y , 0)),988 self.__class__((x , y - 1, 1)),989 self.__class__((x + 1, y - 1, 2)),990 self.__class__((x + 1, y - 1, 0)),991 self.__class__((x + 1, y , 0)),992 self.__class__((x + 1, y , 1)),)993 elif z == 1:994 return adjacent + (995 self.__class__((x - 1, y , 0)),996 self.__class__((x , y - 1, 1)),997 self.__class__((x + 1, y - 1, 1)),998 self.__class__((x + 1, y , 2)),999 self.__class__((x , y + 1, 0)),1000 self.__class__((x , y + 1, 1)),1001 self.__class__((x - 1, y + 1, 1)),1002 self.__class__((x - 1, y + 1, 2)),)1003 elif z == 2:1004 return adjacent + (1005 self.__class__((x + 1, y - 1, 1)),1006 self.__class__((x + 1, y , 2)),1007 self.__class__((x , y + 1, 2)),1008 self.__class__((x - 1, y + 1, 0)),1009 self.__class__((x - 1, y , 1)),1010 self.__class__((x - 1, y , 2)),1011 self.__class__((x , y - 1, 2)),1012 self.__class__((x , y - 1, 0)),)1013class QuasiHexagonalGrid3DCoordSet(HexagonalGrid3DCoordSet):1014 coord_class = QuasiHexagonalGrid3D1015class QuasiHexagonalGrid3DView(HexagonalGrid3DView):1016 coord_class = QuasiHexagonalGrid3D1017def sign(num):1018 return cmp(num, 0)1019def increment_2D(start, end):1020 """1021 Given a `start`- and `end`-point which differ in only one dimension,1022 return a unit vector increment which if repeatedly added to the1023 start-point will eventually result in the end-point.1024 """...
placement_service_unittest.py
Source:placement_service_unittest.py
1#!/usr/bin/python2# -*- coding: UTF-8 -*-3#4# Copyright 2011 Google Inc. All Rights Reserved.5#6# Licensed under the Apache License, Version 2.0 (the "License");7# you may not use this file except in compliance with the License.8# You may obtain a copy of the License at9#10# http://www.apache.org/licenses/LICENSE-2.011#12# Unless required by applicable law or agreed to in writing, software13# distributed under the License is distributed on an "AS IS" BASIS,14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.15# See the License for the specific language governing permissions and16# limitations under the License.17"""Unit tests to cover PlacementService."""18__author__ = 'api.sgrinberg@gmail.com (Stan Grinberg)'19import os20import sys21sys.path.append(os.path.join('..', '..', '..'))22import unittest23from adspygoogle.common import Utils24from tests.adspygoogle.dfp import HTTP_PROXY25from tests.adspygoogle.dfp import SERVER_V20100426from tests.adspygoogle.dfp import SERVER_V20101027from tests.adspygoogle.dfp import SERVER_V20110128from tests.adspygoogle.dfp import SERVER_V20110329from tests.adspygoogle.dfp import VERSION_V20100430from tests.adspygoogle.dfp import VERSION_V20101031from tests.adspygoogle.dfp import VERSION_V20110132from tests.adspygoogle.dfp import VERSION_V20110333from tests.adspygoogle.dfp import client34class PlacementServiceTestV201004(unittest.TestCase):35 """Unittest suite for PlacementService using v201004."""36 SERVER = SERVER_V20100437 VERSION = VERSION_V20100438 client.debug = False39 service = None40 ad_unit_id1 = '0'41 ad_unit_id2 = '0'42 ad_unit_id3 = '0'43 ad_unit_id4 = '0'44 placement1 = None45 placement2 = None46 def setUp(self):47 """Prepare unittest."""48 print self.id()49 if not self.__class__.service:50 self.__class__.service = client.GetPlacementService(51 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)52 if self.__class__.ad_unit_id1 == '0' or self.__class__.ad_unit_id2 == '0':53 inventory_service = client.GetInventoryService(54 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)55 network_service = client.GetNetworkService(56 self.__class__.SERVER, self.__class__.VERSION,57 HTTP_PROXY)58 root_ad_unit_id = \59 network_service.GetCurrentNetwork()[0]['effectiveRootAdUnitId']60 ad_units = [61 {62 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),63 'parentId': root_ad_unit_id,64 'sizes': [{'width': '300', 'height': '250'}]65 },66 {67 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),68 'parentId': root_ad_unit_id,69 'sizes': [{'width': '300', 'height': '250'}]70 },71 {72 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),73 'parentId': root_ad_unit_id,74 'sizes': [{'width': '300', 'height': '250'}]75 },76 {77 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),78 'parentId': root_ad_unit_id,79 'sizes': [{'width': '300', 'height': '250'}]80 }81 ]82 ad_units = inventory_service.CreateAdUnits(ad_units)83 self.__class__.ad_unit_id1 = ad_units[0]['id']84 self.__class__.ad_unit_id2 = ad_units[1]['id']85 self.__class__.ad_unit_id3 = ad_units[2]['id']86 self.__class__.ad_unit_id4 = ad_units[3]['id']87 def testCreatePlacement(self):88 """Test whether we can create a placement."""89 placement = {90 'name': 'Placement #%s' % Utils.GetUniqueName(),91 'description': 'Description.',92 'targetedAdUnitIds': [self.__class__.ad_unit_id1,93 self.__class__.ad_unit_id2]94 }95 self.assert_(isinstance(96 self.__class__.service.CreatePlacement(placement), tuple))97 def testCreatePlacements(self):98 """Test whether we can create a list of placements items."""99 placements = [100 {101 'name': 'Placement #%s' % Utils.GetUniqueName(),102 'description': 'Description.',103 'targetedAdUnitIds': [self.__class__.ad_unit_id1,104 self.__class__.ad_unit_id2]105 },106 {107 'name': 'Placement #%s' % Utils.GetUniqueName(),108 'description': 'Description.',109 'targetedAdUnitIds': [self.__class__.ad_unit_id1,110 self.__class__.ad_unit_id2]111 }112 ]113 placements = self.__class__.service.CreatePlacements(placements)114 self.assert_(isinstance(placements, tuple))115 self.__class__.placement1 = placements[0]116 self.__class__.placement2 = placements[1]117 def testGetPlacement(self):118 """Test whether we can fetch an existing placement."""119 if not self.__class__.placement1:120 self.testCreatePlacements()121 self.assert_(isinstance(self.__class__.service.GetPlacement(122 self.__class__.placement1['id']), tuple))123 def testGetPlacementsByStatement(self):124 """Test whether we can fetch a list of existing placements that match given125 statement."""126 if not self.__class__.placement1:127 self.testCreatePlacements()128 filter_statement = {'query': 'WHERE id = \'%s\' ORDER BY name LIMIT 1'129 % self.__class__.placement1['id']}130 self.assert_(isinstance(131 self.__class__.service.GetPlacementsByStatement(filter_statement),132 tuple))133 def testPerformPlacementAction(self):134 """Test whether we can deactivate a placement."""135 if not self.__class__.placement1:136 self.testCreatePlacements()137 action = {'type': 'DeactivatePlacements'}138 filter_statement = {'query': 'WHERE status = \'ACTIVE\''}139 self.assert_(isinstance(140 self.__class__.service.PerformPlacementAction(action, filter_statement),141 tuple))142 def testUpdatePlacement(self):143 """Test whether we can update a placement."""144 if not self.__class__.placement1:145 self.testCreatePlacements()146 self.__class__.placement1['description'] += ' More description.'147 placement = self.__class__.service.UpdatePlacement(148 self.__class__.placement1)149 self.assert_(isinstance(placement, tuple))150 self.assertEqual(placement[0]['description'],151 self.__class__.placement1['description'])152 self.__class__.placement1['targetedAdUnitIds'].append(153 self.__class__.ad_unit_id3)154 placement = self.__class__.service.UpdatePlacement(155 self.__class__.placement1)156 self.assert_(isinstance(placement, tuple))157 def testUpdatePlacements(self):158 """Test whether we can update a list of placements."""159 if not self.__class__.placement1 or not self.__class__.placement2:160 self.testCreatePlacements()161 self.__class__.placement1['description'] += ' Even more description.'162 self.__class__.placement2['description'] += ' Even more description.'163 placements = self.__class__.service.UpdatePlacements([164 self.__class__.placement1, self.__class__.placement2])165 self.assert_(isinstance(placements, tuple))166 self.__class__.placement1['targetedAdUnitIds'].append(167 self.__class__.ad_unit_id4)168 self.__class__.placement2['targetedAdUnitIds'].append(169 self.__class__.ad_unit_id4)170 placements = self.__class__.service.UpdatePlacements([171 self.__class__.placement1, self.__class__.placement2])172 self.assert_(isinstance(placements, tuple))173class PlacementServiceTestV201010(unittest.TestCase):174 """Unittest suite for PlacementService using v201010."""175 SERVER = SERVER_V201010176 VERSION = VERSION_V201010177 client.debug = False178 service = None179 ad_unit_id1 = '0'180 ad_unit_id2 = '0'181 ad_unit_id3 = '0'182 ad_unit_id4 = '0'183 placement1 = None184 placement2 = None185 def setUp(self):186 """Prepare unittest."""187 print self.id()188 if not self.__class__.service:189 self.__class__.service = client.GetPlacementService(190 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)191 if self.__class__.ad_unit_id1 == '0' or self.__class__.ad_unit_id2 == '0':192 inventory_service = client.GetInventoryService(193 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)194 network_service = client.GetNetworkService(195 self.__class__.SERVER, self.__class__.VERSION,196 HTTP_PROXY)197 root_ad_unit_id = \198 network_service.GetCurrentNetwork()[0]['effectiveRootAdUnitId']199 ad_units = [200 {201 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),202 'parentId': root_ad_unit_id,203 'sizes': [{'width': '300', 'height': '250'}]204 },205 {206 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),207 'parentId': root_ad_unit_id,208 'sizes': [{'width': '300', 'height': '250'}]209 },210 {211 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),212 'parentId': root_ad_unit_id,213 'sizes': [{'width': '300', 'height': '250'}]214 },215 {216 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),217 'parentId': root_ad_unit_id,218 'sizes': [{'width': '300', 'height': '250'}]219 }220 ]221 ad_units = inventory_service.CreateAdUnits(ad_units)222 self.__class__.ad_unit_id1 = ad_units[0]['id']223 self.__class__.ad_unit_id2 = ad_units[1]['id']224 self.__class__.ad_unit_id3 = ad_units[2]['id']225 self.__class__.ad_unit_id4 = ad_units[3]['id']226 def testCreatePlacement(self):227 """Test whether we can create a placement."""228 placement = {229 'name': 'Placement #%s' % Utils.GetUniqueName(),230 'description': 'Description.',231 'targetedAdUnitIds': [self.__class__.ad_unit_id1,232 self.__class__.ad_unit_id2]233 }234 self.assert_(isinstance(235 self.__class__.service.CreatePlacement(placement), tuple))236 def testCreatePlacements(self):237 """Test whether we can create a list of placements items."""238 placements = [239 {240 'name': 'Placement #%s' % Utils.GetUniqueName(),241 'description': 'Description.',242 'targetedAdUnitIds': [self.__class__.ad_unit_id1,243 self.__class__.ad_unit_id2]244 },245 {246 'name': 'Placement #%s' % Utils.GetUniqueName(),247 'description': 'Description.',248 'targetedAdUnitIds': [self.__class__.ad_unit_id1,249 self.__class__.ad_unit_id2]250 }251 ]252 placements = self.__class__.service.CreatePlacements(placements)253 self.assert_(isinstance(placements, tuple))254 self.__class__.placement1 = placements[0]255 self.__class__.placement2 = placements[1]256 def testGetPlacement(self):257 """Test whether we can fetch an existing placement."""258 if not self.__class__.placement1:259 self.testCreatePlacements()260 self.assert_(isinstance(self.__class__.service.GetPlacement(261 self.__class__.placement1['id']), tuple))262 def testGetPlacementsByStatement(self):263 """Test whether we can fetch a list of existing placements that match given264 statement."""265 if not self.__class__.placement1:266 self.testCreatePlacements()267 filter_statement = {'query': 'WHERE id = \'%s\' ORDER BY name LIMIT 1'268 % self.__class__.placement1['id']}269 self.assert_(isinstance(270 self.__class__.service.GetPlacementsByStatement(filter_statement),271 tuple))272 def testPerformPlacementAction(self):273 """Test whether we can deactivate a placement."""274 if not self.__class__.placement1:275 self.testCreatePlacements()276 action = {'type': 'DeactivatePlacements'}277 filter_statement = {'query': 'WHERE status = \'ACTIVE\''}278 self.assert_(isinstance(279 self.__class__.service.PerformPlacementAction(action, filter_statement),280 tuple))281 def testUpdatePlacement(self):282 """Test whether we can update a placement."""283 if not self.__class__.placement1:284 self.testCreatePlacements()285 self.__class__.placement1['description'] += ' More description.'286 placement = self.__class__.service.UpdatePlacement(287 self.__class__.placement1)288 self.assert_(isinstance(placement, tuple))289 self.assertEqual(placement[0]['description'],290 self.__class__.placement1['description'])291 self.__class__.placement1['targetedAdUnitIds'].append(292 self.__class__.ad_unit_id3)293 placement = self.__class__.service.UpdatePlacement(294 self.__class__.placement1)295 self.assert_(isinstance(placement, tuple))296 def testUpdatePlacements(self):297 """Test whether we can update a list of placements."""298 if not self.__class__.placement1 or not self.__class__.placement2:299 self.testCreatePlacements()300 self.__class__.placement1['description'] += ' Even more description.'301 self.__class__.placement2['description'] += ' Even more description.'302 placements = self.__class__.service.UpdatePlacements([303 self.__class__.placement1, self.__class__.placement2])304 self.assert_(isinstance(placements, tuple))305 self.__class__.placement1['targetedAdUnitIds'].append(306 self.__class__.ad_unit_id4)307 self.__class__.placement2['targetedAdUnitIds'].append(308 self.__class__.ad_unit_id4)309 placements = self.__class__.service.UpdatePlacements([310 self.__class__.placement1, self.__class__.placement2])311 self.assert_(isinstance(placements, tuple))312class PlacementServiceTestV201101(unittest.TestCase):313 """Unittest suite for PlacementService using v201101."""314 SERVER = SERVER_V201101315 VERSION = VERSION_V201101316 client.debug = False317 service = None318 ad_unit_id1 = '0'319 ad_unit_id2 = '0'320 ad_unit_id3 = '0'321 ad_unit_id4 = '0'322 placement1 = None323 placement2 = None324 def setUp(self):325 """Prepare unittest."""326 print self.id()327 if not self.__class__.service:328 self.__class__.service = client.GetPlacementService(329 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)330 if self.__class__.ad_unit_id1 == '0' or self.__class__.ad_unit_id2 == '0':331 inventory_service = client.GetInventoryService(332 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)333 network_service = client.GetNetworkService(334 self.__class__.SERVER, self.__class__.VERSION,335 HTTP_PROXY)336 root_ad_unit_id = \337 network_service.GetCurrentNetwork()[0]['effectiveRootAdUnitId']338 ad_units = [339 {340 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),341 'parentId': root_ad_unit_id,342 'sizes': [{'width': '300', 'height': '250'}]343 },344 {345 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),346 'parentId': root_ad_unit_id,347 'sizes': [{'width': '300', 'height': '250'}]348 },349 {350 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),351 'parentId': root_ad_unit_id,352 'sizes': [{'width': '300', 'height': '250'}]353 },354 {355 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),356 'parentId': root_ad_unit_id,357 'sizes': [{'width': '300', 'height': '250'}]358 }359 ]360 ad_units = inventory_service.CreateAdUnits(ad_units)361 self.__class__.ad_unit_id1 = ad_units[0]['id']362 self.__class__.ad_unit_id2 = ad_units[1]['id']363 self.__class__.ad_unit_id3 = ad_units[2]['id']364 self.__class__.ad_unit_id4 = ad_units[3]['id']365 def testCreatePlacement(self):366 """Test whether we can create a placement."""367 placement = {368 'name': 'Placement #%s' % Utils.GetUniqueName(),369 'description': 'Description.',370 'targetedAdUnitIds': [self.__class__.ad_unit_id1,371 self.__class__.ad_unit_id2]372 }373 self.assert_(isinstance(374 self.__class__.service.CreatePlacement(placement), tuple))375 def testCreatePlacements(self):376 """Test whether we can create a list of placements items."""377 placements = [378 {379 'name': 'Placement #%s' % Utils.GetUniqueName(),380 'description': 'Description.',381 'targetedAdUnitIds': [self.__class__.ad_unit_id1,382 self.__class__.ad_unit_id2]383 },384 {385 'name': 'Placement #%s' % Utils.GetUniqueName(),386 'description': 'Description.',387 'targetedAdUnitIds': [self.__class__.ad_unit_id1,388 self.__class__.ad_unit_id2]389 }390 ]391 placements = self.__class__.service.CreatePlacements(placements)392 self.assert_(isinstance(placements, tuple))393 self.__class__.placement1 = placements[0]394 self.__class__.placement2 = placements[1]395 def testGetPlacement(self):396 """Test whether we can fetch an existing placement."""397 if not self.__class__.placement1:398 self.testCreatePlacements()399 self.assert_(isinstance(self.__class__.service.GetPlacement(400 self.__class__.placement1['id']), tuple))401 def testGetPlacementsByStatement(self):402 """Test whether we can fetch a list of existing placements that match given403 statement."""404 if not self.__class__.placement1:405 self.testCreatePlacements()406 filter_statement = {'query': 'WHERE id = \'%s\' ORDER BY name LIMIT 1'407 % self.__class__.placement1['id']}408 self.assert_(isinstance(409 self.__class__.service.GetPlacementsByStatement(filter_statement),410 tuple))411 def testPerformPlacementAction(self):412 """Test whether we can deactivate a placement."""413 if not self.__class__.placement1:414 self.testCreatePlacements()415 action = {'type': 'DeactivatePlacements'}416 filter_statement = {'query': 'WHERE status = \'ACTIVE\''}417 self.assert_(isinstance(418 self.__class__.service.PerformPlacementAction(action, filter_statement),419 tuple))420 def testUpdatePlacement(self):421 """Test whether we can update a placement."""422 if not self.__class__.placement1:423 self.testCreatePlacements()424 self.__class__.placement1['description'] += ' More description.'425 placement = self.__class__.service.UpdatePlacement(426 self.__class__.placement1)427 self.assert_(isinstance(placement, tuple))428 self.assertEqual(placement[0]['description'],429 self.__class__.placement1['description'])430 self.__class__.placement1['targetedAdUnitIds'].append(431 self.__class__.ad_unit_id3)432 placement = self.__class__.service.UpdatePlacement(433 self.__class__.placement1)434 self.assert_(isinstance(placement, tuple))435 def testUpdatePlacements(self):436 """Test whether we can update a list of placements."""437 if not self.__class__.placement1 or not self.__class__.placement2:438 self.testCreatePlacements()439 self.__class__.placement1['description'] += ' Even more description.'440 self.__class__.placement2['description'] += ' Even more description.'441 placements = self.__class__.service.UpdatePlacements([442 self.__class__.placement1, self.__class__.placement2])443 self.assert_(isinstance(placements, tuple))444 self.__class__.placement1['targetedAdUnitIds'].append(445 self.__class__.ad_unit_id4)446 self.__class__.placement2['targetedAdUnitIds'].append(447 self.__class__.ad_unit_id4)448 placements = self.__class__.service.UpdatePlacements([449 self.__class__.placement1, self.__class__.placement2])450 self.assert_(isinstance(placements, tuple))451class PlacementServiceTestV201103(unittest.TestCase):452 """Unittest suite for PlacementService using v201103."""453 SERVER = SERVER_V201103454 VERSION = VERSION_V201103455 client.debug = False456 service = None457 ad_unit_id1 = '0'458 ad_unit_id2 = '0'459 ad_unit_id3 = '0'460 ad_unit_id4 = '0'461 placement1 = None462 placement2 = None463 def setUp(self):464 """Prepare unittest."""465 print self.id()466 if not self.__class__.service:467 self.__class__.service = client.GetPlacementService(468 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)469 if self.__class__.ad_unit_id1 == '0' or self.__class__.ad_unit_id2 == '0':470 inventory_service = client.GetInventoryService(471 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)472 network_service = client.GetNetworkService(473 self.__class__.SERVER, self.__class__.VERSION,474 HTTP_PROXY)475 root_ad_unit_id = \476 network_service.GetCurrentNetwork()[0]['effectiveRootAdUnitId']477 ad_units = [478 {479 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),480 'parentId': root_ad_unit_id,481 'sizes': [{'width': '300', 'height': '250'}]482 },483 {484 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),485 'parentId': root_ad_unit_id,486 'sizes': [{'width': '300', 'height': '250'}]487 },488 {489 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),490 'parentId': root_ad_unit_id,491 'sizes': [{'width': '300', 'height': '250'}]492 },493 {494 'name': 'Ad_Unit_%s' % Utils.GetUniqueName(),495 'parentId': root_ad_unit_id,496 'sizes': [{'width': '300', 'height': '250'}]497 }498 ]499 ad_units = inventory_service.CreateAdUnits(ad_units)500 self.__class__.ad_unit_id1 = ad_units[0]['id']501 self.__class__.ad_unit_id2 = ad_units[1]['id']502 self.__class__.ad_unit_id3 = ad_units[2]['id']503 self.__class__.ad_unit_id4 = ad_units[3]['id']504 def testCreatePlacement(self):505 """Test whether we can create a placement."""506 placement = {507 'name': 'Placement #%s' % Utils.GetUniqueName(),508 'description': 'Description.',509 'targetedAdUnitIds': [self.__class__.ad_unit_id1,510 self.__class__.ad_unit_id2]511 }512 self.assert_(isinstance(513 self.__class__.service.CreatePlacement(placement), tuple))514 def testCreatePlacements(self):515 """Test whether we can create a list of placements items."""516 placements = [517 {518 'name': 'Placement #%s' % Utils.GetUniqueName(),519 'description': 'Description.',520 'targetedAdUnitIds': [self.__class__.ad_unit_id1,521 self.__class__.ad_unit_id2]522 },523 {524 'name': 'Placement #%s' % Utils.GetUniqueName(),525 'description': 'Description.',526 'targetedAdUnitIds': [self.__class__.ad_unit_id1,527 self.__class__.ad_unit_id2]528 }529 ]530 placements = self.__class__.service.CreatePlacements(placements)531 self.assert_(isinstance(placements, tuple))532 self.__class__.placement1 = placements[0]533 self.__class__.placement2 = placements[1]534 def testGetPlacement(self):535 """Test whether we can fetch an existing placement."""536 if not self.__class__.placement1:537 self.testCreatePlacements()538 self.assert_(isinstance(self.__class__.service.GetPlacement(539 self.__class__.placement1['id']), tuple))540 def testGetPlacementsByStatement(self):541 """Test whether we can fetch a list of existing placements that match given542 statement."""543 if not self.__class__.placement1:544 self.testCreatePlacements()545 filter_statement = {'query': 'WHERE id = \'%s\' ORDER BY name LIMIT 1'546 % self.__class__.placement1['id']}547 self.assert_(isinstance(548 self.__class__.service.GetPlacementsByStatement(filter_statement),549 tuple))550 def testPerformPlacementAction(self):551 """Test whether we can deactivate a placement."""552 if not self.__class__.placement1:553 self.testCreatePlacements()554 action = {'type': 'DeactivatePlacements'}555 filter_statement = {'query': 'WHERE status = \'ACTIVE\''}556 self.assert_(isinstance(557 self.__class__.service.PerformPlacementAction(action, filter_statement),558 tuple))559 def testUpdatePlacement(self):560 """Test whether we can update a placement."""561 if not self.__class__.placement1:562 self.testCreatePlacements()563 self.__class__.placement1['description'] += ' More description.'564 placement = self.__class__.service.UpdatePlacement(565 self.__class__.placement1)566 self.assert_(isinstance(placement, tuple))567 self.assertEqual(placement[0]['description'],568 self.__class__.placement1['description'])569 self.__class__.placement1['targetedAdUnitIds'].append(570 self.__class__.ad_unit_id3)571 placement = self.__class__.service.UpdatePlacement(572 self.__class__.placement1)573 self.assert_(isinstance(placement, tuple))574 def testUpdatePlacements(self):575 """Test whether we can update a list of placements."""576 if not self.__class__.placement1 or not self.__class__.placement2:577 self.testCreatePlacements()578 self.__class__.placement1['description'] += ' Even more description.'579 self.__class__.placement2['description'] += ' Even more description.'580 placements = self.__class__.service.UpdatePlacements([581 self.__class__.placement1, self.__class__.placement2])582 self.assert_(isinstance(placements, tuple))583 self.__class__.placement1['targetedAdUnitIds'].append(584 self.__class__.ad_unit_id4)585 self.__class__.placement2['targetedAdUnitIds'].append(586 self.__class__.ad_unit_id4)587 placements = self.__class__.service.UpdatePlacements([588 self.__class__.placement1, self.__class__.placement2])589 self.assert_(isinstance(placements, tuple))590def makeTestSuiteV201004():591 """Set up test suite using v201004.592 Returns:593 TestSuite test suite using v201004.594 """595 suite = unittest.TestSuite()596 suite.addTests(unittest.makeSuite(PlacementServiceTestV201004))597 return suite598def makeTestSuiteV201010():599 """Set up test suite using v201010.600 Returns:601 TestSuite test suite using v201010.602 """603 suite = unittest.TestSuite()604 suite.addTests(unittest.makeSuite(PlacementServiceTestV201010))605 return suite606def makeTestSuiteV201101():607 """Set up test suite using v201101.608 Returns:609 TestSuite test suite using v201101.610 """611 suite = unittest.TestSuite()612 suite.addTests(unittest.makeSuite(PlacementServiceTestV201101))613 return suite614def makeTestSuiteV201103():615 """Set up test suite using v201103.616 Returns:617 TestSuite test suite using v201103.618 """619 suite = unittest.TestSuite()620 suite.addTests(unittest.makeSuite(PlacementServiceTestV201103))621 return suite622if __name__ == '__main__':623 suite_v201004 = makeTestSuiteV201004()624 suite_v201010 = makeTestSuiteV201010()625 suite_v201101 = makeTestSuiteV201101()626 suite_v201103 = makeTestSuiteV201103()627 alltests = unittest.TestSuite([suite_v201004, suite_v201010, suite_v201101,628 suite_v201103])...
order_service_unittest.py
Source:order_service_unittest.py
1#!/usr/bin/python2# -*- coding: UTF-8 -*-3#4# Copyright 2011 Google Inc. All Rights Reserved.5#6# Licensed under the Apache License, Version 2.0 (the "License");7# you may not use this file except in compliance with the License.8# You may obtain a copy of the License at9#10# http://www.apache.org/licenses/LICENSE-2.011#12# Unless required by applicable law or agreed to in writing, software13# distributed under the License is distributed on an "AS IS" BASIS,14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.15# See the License for the specific language governing permissions and16# limitations under the License.17"""Unit tests to cover OrderService."""18__author__ = 'api.sgrinberg@gmail.com (Stan Grinberg)'19import os20import sys21sys.path.append(os.path.join('..', '..', '..'))22import unittest23from adspygoogle.common import Utils24from tests.adspygoogle.dfp import HTTP_PROXY25from tests.adspygoogle.dfp import SERVER_V20100426from tests.adspygoogle.dfp import SERVER_V20101027from tests.adspygoogle.dfp import SERVER_V20110128from tests.adspygoogle.dfp import SERVER_V20110329from tests.adspygoogle.dfp import VERSION_V20100430from tests.adspygoogle.dfp import VERSION_V20101031from tests.adspygoogle.dfp import VERSION_V20110132from tests.adspygoogle.dfp import VERSION_V20110333from tests.adspygoogle.dfp import client34class OrderServiceTestV201004(unittest.TestCase):35 """Unittest suite for OrderService using v201004."""36 SERVER = SERVER_V20100437 VERSION = VERSION_V20100438 client.debug = False39 service = None40 advertiser_id = '0'41 salesperson_id = '0'42 trafficker_id = '0'43 order1 = None44 order2 = None45 def setUp(self):46 """Prepare unittest."""47 print self.id()48 if not self.__class__.service:49 self.__class__.service = client.GetOrderService(50 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)51 if self.__class__.advertiser_id == '0':52 company = {53 'name': 'Company #%s' % Utils.GetUniqueName(),54 'type': 'ADVERTISER'55 }56 self.__class__.advertiser_id = client.GetCompanyService(57 self.__class__.SERVER, self.__class__.VERSION,58 HTTP_PROXY).CreateCompany(company)[0]['id']59 if self.__class__.trafficker_id == '0':60 filter_statement = {'query': 'ORDER BY name LIMIT 500'}61 users = client.GetUserService(62 self.__class__.SERVER, self.__class__.VERSION,63 HTTP_PROXY).GetUsersByStatement(filter_statement)64 for user in users[0]['results']:65 if user['roleName'] in ('Salesperson',):66 self.__class__.salesperson_id = user['id']67 continue68 elif user['roleName'] in ('Trafficker',):69 self.__class__.trafficker_id = user['id']70 continue71 def testCreateOrder(self):72 """Test whether we can create an order."""73 order = {74 'advertiserId': self.__class__.advertiser_id,75 'currencyCode': 'USD',76 'name': 'Order #%s' % Utils.GetUniqueName(),77 'traffickerId': self.__class__.trafficker_id78 }79 self.assert_(isinstance(80 self.__class__.service.CreateOrder(order), tuple))81 def testCreateOrders(self):82 """Test whether we can create a list of orders."""83 orders = [84 {85 'advertiserId': self.__class__.advertiser_id,86 'currencyCode': 'USD',87 'name': 'Order #%s' % Utils.GetUniqueName(),88 'traffickerId': self.__class__.trafficker_id89 },90 {91 'advertiserId': self.__class__.advertiser_id,92 'currencyCode': 'USD',93 'name': 'Order #%s' % Utils.GetUniqueName(),94 'traffickerId': self.__class__.trafficker_id95 }96 ]97 orders = self.__class__.service.CreateOrders(orders)98 self.__class__.order1 = orders[0]99 self.__class__.order2 = orders[1]100 self.assert_(isinstance(orders, tuple))101 def testGetOrder(self):102 """Test whether we can fetch an existing order."""103 if not self.__class__.order1:104 self.testCreateOrders()105 self.assert_(isinstance(self.__class__.service.GetOrder(106 self.__class__.order1['id']), tuple))107 def testGetOrdersByStatement(self):108 """Test whether we can fetch a list of existing orders that match given109 statement."""110 if not self.__class__.order1:111 self.testCreateOrders()112 filter_statement = {'query': 'WHERE advertiserId = \'%s\' LIMIT 500'113 % self.__class__.advertiser_id}114 self.assert_(isinstance(115 self.__class__.service.GetOrdersByStatement(filter_statement),116 tuple))117 def testPerformOrderAction(self):118 """Test whether we can approve order."""119 action = {'type': 'ApproveOrders'}120 filter_statement = {'query': 'WHERE status = \'DRAFT\''}121 self.assert_(isinstance(122 self.__class__.service.PerformOrderAction(action, filter_statement),123 tuple))124 def testUpdateOrder(self):125 """Test whether we can update an order."""126 if not self.__class__.order1:127 self.testCreateOrders()128 notes = 'Spoke to advertiser. All is well.'129 self.__class__.order1['notes'] = notes130 order = self.__class__.service.UpdateOrder(self.__class__.order1)131 self.assert_(isinstance(order, tuple))132 self.assertEqual(order[0]['notes'], notes)133 def testUpdateOrders(self):134 """Test whether we can update a list of orders."""135 if not self.__class__.order1 or not self.__class__.order2:136 self.testCreateOrders()137 notes = 'Spoke to advertiser. All is well.'138 self.__class__.order1['notes'] = notes139 self.__class__.order2['notes'] = notes140 orders = self.__class__.service.UpdateOrders([self.__class__.order1,141 self.__class__.order2])142 self.assert_(isinstance(orders, tuple))143 for order in orders:144 self.assertEqual(order['notes'], notes)145class OrderServiceTestV201010(unittest.TestCase):146 """Unittest suite for OrderService using v201010."""147 SERVER = SERVER_V201010148 VERSION = VERSION_V201010149 client.debug = False150 service = None151 advertiser_id = '0'152 salesperson_id = '0'153 trafficker_id = '0'154 order1 = None155 order2 = None156 def setUp(self):157 """Prepare unittest."""158 print self.id()159 if not self.__class__.service:160 self.__class__.service = client.GetOrderService(161 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)162 if self.__class__.advertiser_id == '0':163 company = {164 'name': 'Company #%s' % Utils.GetUniqueName(),165 'type': 'ADVERTISER'166 }167 self.__class__.advertiser_id = client.GetCompanyService(168 self.__class__.SERVER, self.__class__.VERSION,169 HTTP_PROXY).CreateCompany(company)[0]['id']170 if self.__class__.trafficker_id == '0':171 filter_statement = {'query': 'ORDER BY name LIMIT 500'}172 users = client.GetUserService(173 self.__class__.SERVER, self.__class__.VERSION,174 HTTP_PROXY).GetUsersByStatement(filter_statement)175 for user in users[0]['results']:176 if user['roleName'] in ('Salesperson',):177 self.__class__.salesperson_id = user['id']178 continue179 elif user['roleName'] in ('Trafficker',):180 self.__class__.trafficker_id = user['id']181 continue182 def testCreateOrder(self):183 """Test whether we can create an order."""184 order = {185 'advertiserId': self.__class__.advertiser_id,186 'currencyCode': 'USD',187 'name': 'Order #%s' % Utils.GetUniqueName(),188 'traffickerId': self.__class__.trafficker_id189 }190 self.assert_(isinstance(191 self.__class__.service.CreateOrder(order), tuple))192 def testCreateOrders(self):193 """Test whether we can create a list of orders."""194 orders = [195 {196 'advertiserId': self.__class__.advertiser_id,197 'currencyCode': 'USD',198 'name': 'Order #%s' % Utils.GetUniqueName(),199 'traffickerId': self.__class__.trafficker_id200 },201 {202 'advertiserId': self.__class__.advertiser_id,203 'currencyCode': 'USD',204 'name': 'Order #%s' % Utils.GetUniqueName(),205 'traffickerId': self.__class__.trafficker_id206 }207 ]208 orders = self.__class__.service.CreateOrders(orders)209 self.__class__.order1 = orders[0]210 self.__class__.order2 = orders[1]211 self.assert_(isinstance(orders, tuple))212 def testGetOrder(self):213 """Test whether we can fetch an existing order."""214 if not self.__class__.order1:215 self.testCreateOrders()216 self.assert_(isinstance(self.__class__.service.GetOrder(217 self.__class__.order1['id']), tuple))218 def testGetOrdersByStatement(self):219 """Test whether we can fetch a list of existing orders that match given220 statement."""221 if not self.__class__.order1:222 self.testCreateOrders()223 filter_statement = {'query': 'WHERE advertiserId = \'%s\' LIMIT 500'224 % self.__class__.advertiser_id}225 self.assert_(isinstance(226 self.__class__.service.GetOrdersByStatement(filter_statement),227 tuple))228 def testPerformOrderAction(self):229 """Test whether we can approve order."""230 action = {'type': 'ApproveOrders'}231 filter_statement = {'query': 'WHERE status = \'DRAFT\''}232 self.assert_(isinstance(233 self.__class__.service.PerformOrderAction(action, filter_statement),234 tuple))235 def testUpdateOrder(self):236 """Test whether we can update an order."""237 if not self.__class__.order1:238 self.testCreateOrders()239 notes = 'Spoke to advertiser. All is well.'240 self.__class__.order1['notes'] = notes241 order = self.__class__.service.UpdateOrder(self.__class__.order1)242 self.assert_(isinstance(order, tuple))243 self.assertEqual(order[0]['notes'], notes)244 def testUpdateOrders(self):245 """Test whether we can update a list of orders."""246 if not self.__class__.order1 or not self.__class__.order2:247 self.testCreateOrders()248 notes = 'Spoke to advertiser. All is well.'249 self.__class__.order1['notes'] = notes250 self.__class__.order2['notes'] = notes251 orders = self.__class__.service.UpdateOrders([self.__class__.order1,252 self.__class__.order2])253 self.assert_(isinstance(orders, tuple))254 for order in orders:255 self.assertEqual(order['notes'], notes)256class OrderServiceTestV201101(unittest.TestCase):257 """Unittest suite for OrderService using v201101."""258 SERVER = SERVER_V201101259 VERSION = VERSION_V201101260 client.debug = False261 service = None262 advertiser_id = '0'263 salesperson_id = '0'264 trafficker_id = '0'265 order1 = None266 order2 = None267 def setUp(self):268 """Prepare unittest."""269 print self.id()270 if not self.__class__.service:271 self.__class__.service = client.GetOrderService(272 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)273 if self.__class__.advertiser_id == '0':274 company = {275 'name': 'Company #%s' % Utils.GetUniqueName(),276 'type': 'ADVERTISER'277 }278 self.__class__.advertiser_id = client.GetCompanyService(279 self.__class__.SERVER, self.__class__.VERSION,280 HTTP_PROXY).CreateCompany(company)[0]['id']281 if self.__class__.trafficker_id == '0':282 filter_statement = {'query': 'ORDER BY name LIMIT 500'}283 users = client.GetUserService(284 self.__class__.SERVER, self.__class__.VERSION,285 HTTP_PROXY).GetUsersByStatement(filter_statement)286 for user in users[0]['results']:287 if user['roleName'] in ('Salesperson',):288 self.__class__.salesperson_id = user['id']289 continue290 elif user['roleName'] in ('Trafficker',):291 self.__class__.trafficker_id = user['id']292 continue293 def testCreateOrder(self):294 """Test whether we can create an order."""295 order = {296 'advertiserId': self.__class__.advertiser_id,297 'currencyCode': 'USD',298 'name': 'Order #%s' % Utils.GetUniqueName(),299 'traffickerId': self.__class__.trafficker_id300 }301 self.assert_(isinstance(302 self.__class__.service.CreateOrder(order), tuple))303 def testCreateOrders(self):304 """Test whether we can create a list of orders."""305 orders = [306 {307 'advertiserId': self.__class__.advertiser_id,308 'currencyCode': 'USD',309 'name': 'Order #%s' % Utils.GetUniqueName(),310 'traffickerId': self.__class__.trafficker_id311 },312 {313 'advertiserId': self.__class__.advertiser_id,314 'currencyCode': 'USD',315 'name': 'Order #%s' % Utils.GetUniqueName(),316 'traffickerId': self.__class__.trafficker_id317 }318 ]319 orders = self.__class__.service.CreateOrders(orders)320 self.__class__.order1 = orders[0]321 self.__class__.order2 = orders[1]322 self.assert_(isinstance(orders, tuple))323 def testGetOrder(self):324 """Test whether we can fetch an existing order."""325 if not self.__class__.order1:326 self.testCreateOrders()327 self.assert_(isinstance(self.__class__.service.GetOrder(328 self.__class__.order1['id']), tuple))329 def testGetOrdersByStatement(self):330 """Test whether we can fetch a list of existing orders that match given331 statement."""332 if not self.__class__.order1:333 self.testCreateOrders()334 filter_statement = {'query': 'WHERE advertiserId = \'%s\' LIMIT 500'335 % self.__class__.advertiser_id}336 self.assert_(isinstance(337 self.__class__.service.GetOrdersByStatement(filter_statement),338 tuple))339 def testPerformOrderAction(self):340 """Test whether we can approve order."""341 action = {'type': 'ApproveOrders'}342 filter_statement = {'query': 'WHERE status = \'DRAFT\''}343 self.assert_(isinstance(344 self.__class__.service.PerformOrderAction(action, filter_statement),345 tuple))346 def testUpdateOrder(self):347 """Test whether we can update an order."""348 if not self.__class__.order1:349 self.testCreateOrders()350 notes = 'Spoke to advertiser. All is well.'351 self.__class__.order1['notes'] = notes352 order = self.__class__.service.UpdateOrder(self.__class__.order1)353 self.assert_(isinstance(order, tuple))354 self.assertEqual(order[0]['notes'], notes)355 def testUpdateOrders(self):356 """Test whether we can update a list of orders."""357 if not self.__class__.order1 or not self.__class__.order2:358 self.testCreateOrders()359 notes = 'Spoke to advertiser. All is well.'360 self.__class__.order1['notes'] = notes361 self.__class__.order2['notes'] = notes362 orders = self.__class__.service.UpdateOrders([self.__class__.order1,363 self.__class__.order2])364 self.assert_(isinstance(orders, tuple))365 for order in orders:366 self.assertEqual(order['notes'], notes)367class OrderServiceTestV201103(unittest.TestCase):368 """Unittest suite for OrderService using v201103."""369 SERVER = SERVER_V201103370 VERSION = VERSION_V201103371 client.debug = False372 service = None373 advertiser_id = '0'374 salesperson_id = '0'375 trafficker_id = '0'376 order1 = None377 order2 = None378 def setUp(self):379 """Prepare unittest."""380 print self.id()381 if not self.__class__.service:382 self.__class__.service = client.GetOrderService(383 self.__class__.SERVER, self.__class__.VERSION, HTTP_PROXY)384 if self.__class__.advertiser_id == '0':385 company = {386 'name': 'Company #%s' % Utils.GetUniqueName(),387 'type': 'ADVERTISER'388 }389 self.__class__.advertiser_id = client.GetCompanyService(390 self.__class__.SERVER, self.__class__.VERSION,391 HTTP_PROXY).CreateCompany(company)[0]['id']392 if self.__class__.trafficker_id == '0':393 filter_statement = {'query': 'ORDER BY name LIMIT 500'}394 users = client.GetUserService(395 self.__class__.SERVER, self.__class__.VERSION,396 HTTP_PROXY).GetUsersByStatement(filter_statement)397 for user in users[0]['results']:398 if user['roleName'] in ('Salesperson',):399 self.__class__.salesperson_id = user['id']400 continue401 elif user['roleName'] in ('Trafficker',):402 self.__class__.trafficker_id = user['id']403 continue404 def testCreateOrder(self):405 """Test whether we can create an order."""406 order = {407 'advertiserId': self.__class__.advertiser_id,408 'currencyCode': 'USD',409 'name': 'Order #%s' % Utils.GetUniqueName(),410 'traffickerId': self.__class__.trafficker_id411 }412 self.assert_(isinstance(413 self.__class__.service.CreateOrder(order), tuple))414 def testCreateOrders(self):415 """Test whether we can create a list of orders."""416 orders = [417 {418 'advertiserId': self.__class__.advertiser_id,419 'currencyCode': 'USD',420 'name': 'Order #%s' % Utils.GetUniqueName(),421 'traffickerId': self.__class__.trafficker_id422 },423 {424 'advertiserId': self.__class__.advertiser_id,425 'currencyCode': 'USD',426 'name': 'Order #%s' % Utils.GetUniqueName(),427 'traffickerId': self.__class__.trafficker_id428 }429 ]430 orders = self.__class__.service.CreateOrders(orders)431 self.__class__.order1 = orders[0]432 self.__class__.order2 = orders[1]433 self.assert_(isinstance(orders, tuple))434 def testGetOrder(self):435 """Test whether we can fetch an existing order."""436 if not self.__class__.order1:437 self.testCreateOrders()438 self.assert_(isinstance(self.__class__.service.GetOrder(439 self.__class__.order1['id']), tuple))440 def testGetOrdersByStatement(self):441 """Test whether we can fetch a list of existing orders that match given442 statement."""443 if not self.__class__.order1:444 self.testCreateOrders()445 filter_statement = {'query': 'WHERE advertiserId = \'%s\' LIMIT 500'446 % self.__class__.advertiser_id}447 self.assert_(isinstance(448 self.__class__.service.GetOrdersByStatement(filter_statement),449 tuple))450 def testPerformOrderAction(self):451 """Test whether we can approve order."""452 action = {'type': 'ApproveOrders'}453 filter_statement = {'query': 'WHERE status = \'DRAFT\''}454 self.assert_(isinstance(455 self.__class__.service.PerformOrderAction(action, filter_statement),456 tuple))457 def testUpdateOrder(self):458 """Test whether we can update an order."""459 if not self.__class__.order1:460 self.testCreateOrders()461 notes = 'Spoke to advertiser. All is well.'462 self.__class__.order1['notes'] = notes463 order = self.__class__.service.UpdateOrder(self.__class__.order1)464 self.assert_(isinstance(order, tuple))465 self.assertEqual(order[0]['notes'], notes)466 def testUpdateOrders(self):467 """Test whether we can update a list of orders."""468 if not self.__class__.order1 or not self.__class__.order2:469 self.testCreateOrders()470 notes = 'Spoke to advertiser. All is well.'471 self.__class__.order1['notes'] = notes472 self.__class__.order2['notes'] = notes473 orders = self.__class__.service.UpdateOrders([self.__class__.order1,474 self.__class__.order2])475 self.assert_(isinstance(orders, tuple))476 for order in orders:477 self.assertEqual(order['notes'], notes)478def makeTestSuiteV201004():479 """Set up test suite using v201004.480 Returns:481 TestSuite test suite using v201004.482 """483 suite = unittest.TestSuite()484 suite.addTests(unittest.makeSuite(OrderServiceTestV201004))485 return suite486def makeTestSuiteV201010():487 """Set up test suite using v201010.488 Returns:489 TestSuite test suite using v201010.490 """491 suite = unittest.TestSuite()492 suite.addTests(unittest.makeSuite(OrderServiceTestV201010))493 return suite494def makeTestSuiteV201101():495 """Set up test suite using v201101.496 Returns:497 TestSuite test suite using v201101.498 """499 suite = unittest.TestSuite()500 suite.addTests(unittest.makeSuite(OrderServiceTestV201101))501 return suite502def makeTestSuiteV201103():503 """Set up test suite using v201103.504 Returns:505 TestSuite test suite using v201103.506 """507 suite = unittest.TestSuite()508 suite.addTests(unittest.makeSuite(OrderServiceTestV201103))509 return suite510if __name__ == '__main__':511 suite_v201004 = makeTestSuiteV201004()512 suite_v201010 = makeTestSuiteV201010()513 suite_v201101 = makeTestSuiteV201101()514 suite_v201103 = makeTestSuiteV201103()515 alltests = unittest.TestSuite([suite_v201004, suite_v201010, suite_v201101,516 suite_v201103])...
test_super.py
Source:test_super.py
1"""Unit tests for new super() implementation."""2import sys3import unittest4class A:5 def f(self):6 return 'A'7 @classmethod8 def cm(cls):9 return (cls, 'A')10class B(A):11 def f(self):12 return super().f() + 'B'13 @classmethod14 def cm(cls):15 return (cls, super().cm(), 'B')16class C(A):17 def f(self):18 return super().f() + 'C'19 @classmethod20 def cm(cls):21 return (cls, super().cm(), 'C')22class D(C, B):23 def f(self):24 return super().f() + 'D'25 def cm(cls):26 return (cls, super().cm(), 'D')27class E(D):28 pass29class F(E):30 f = E.f31class G(A):32 pass33class TestSuper(unittest.TestCase):34 def tearDown(self):35 # This fixes the damage that test_various___class___pathologies does.36 nonlocal __class__37 __class__ = TestSuper38 def test_basics_working(self):39 self.assertEqual(D().f(), 'ABCD')40 def test_class_getattr_working(self):41 self.assertEqual(D.f(D()), 'ABCD')42 def test_subclass_no_override_working(self):43 self.assertEqual(E().f(), 'ABCD')44 self.assertEqual(E.f(E()), 'ABCD')45 def test_unbound_method_transfer_working(self):46 self.assertEqual(F().f(), 'ABCD')47 self.assertEqual(F.f(F()), 'ABCD')48 def test_class_methods_still_working(self):49 self.assertEqual(A.cm(), (A, 'A'))50 self.assertEqual(A().cm(), (A, 'A'))51 self.assertEqual(G.cm(), (G, 'A'))52 self.assertEqual(G().cm(), (G, 'A'))53 def test_super_in_class_methods_working(self):54 d = D()55 self.assertEqual(d.cm(), (d, (D, (D, (D, 'A'), 'B'), 'C'), 'D'))56 e = E()57 self.assertEqual(e.cm(), (e, (E, (E, (E, 'A'), 'B'), 'C'), 'D'))58 def test_super_with_closure(self):59 # Issue4360: super() did not work in a function that60 # contains a closure61 class E(A):62 def f(self):63 def nested():64 self65 return super().f() + 'E'66 self.assertEqual(E().f(), 'AE')67 def test_various___class___pathologies(self):68 # See issue #1237069 class X(A):70 def f(self):71 return super().f()72 __class__ = 41373 x = X()74 self.assertEqual(x.f(), 'A')75 self.assertEqual(x.__class__, 413)76 class X:77 x = __class__78 def f():79 __class__80 self.assertIs(X.x, type(self))81 with self.assertRaises(NameError) as e:82 exec("""class X:83 __class__84 def f():85 __class__""", globals(), {})86 self.assertIs(type(e.exception), NameError) # Not UnboundLocalError87 class X:88 global __class__89 __class__ = 4290 def f():91 __class__92 self.assertEqual(globals()["__class__"], 42)93 del globals()["__class__"]94 self.assertNotIn("__class__", X.__dict__)95 class X:96 nonlocal __class__97 __class__ = 4298 def f():99 __class__100 self.assertEqual(__class__, 42)101 def test___class___instancemethod(self):102 # See issue #14857103 class X:104 def f(self):105 return __class__106 self.assertIs(X().f(), X)107 def test___class___classmethod(self):108 # See issue #14857109 class X:110 @classmethod111 def f(cls):112 return __class__113 self.assertIs(X.f(), X)114 def test___class___staticmethod(self):115 # See issue #14857116 class X:117 @staticmethod118 def f():119 return __class__120 self.assertIs(X.f(), X)121 def test_obscure_super_errors(self):122 def f():123 super()124 self.assertRaises(RuntimeError, f)125 def f(x):126 del x127 super()128 self.assertRaises(RuntimeError, f, None)129 class X:130 def f(x):131 nonlocal __class__132 del __class__133 super()134 self.assertRaises(RuntimeError, X().f)135 def test_cell_as_self(self):136 class X:137 def meth(self):138 super()139 def f():140 k = X()141 def g():142 return k143 return g144 c = f().__closure__[0]145 self.assertRaises(TypeError, X.meth, c)146if __name__ == "__main__":...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!