Best Mockery code snippet using are.andReturns
AppendStreamTest.php
Source: AppendStreamTest.php
...16 public function testGetContents(): void17 {18 $streamMock = M::mock(Stream::class);19 $appendedStreamMock = M::mock(Stream::class);20 $streamMock->expects('getContents')->andReturns('foo');21 $appendedStreamMock->expects('getContents')->andReturns('bar');22 $appendStream = new AppendStream($streamMock, $appendedStreamMock);23 static::assertEquals('foobar', $appendStream->getContents());24 }25 public function testToString(): void26 {27 $streamMock = M::mock(Stream::class);28 $appendedStreamMock = M::mock(Stream::class);29 $streamMock->expects('__toString')->andReturns('foo');30 $appendedStreamMock->expects('__toString')->andReturns('bar');31 $appendStream = new AppendStream($streamMock, $appendedStreamMock);32 static::assertEquals('foobar', (string) $appendStream);33 }34 public function testDetach(): void35 {36 $streamMock = M::mock(Stream::class);37 $appendedStreamMock = M::mock(Stream::class);38 $streamMock->expects('detach')->andReturns(1);39 $appendedStreamMock->expects('detach')->andReturns(2);40 $appendStream = new AppendStream($streamMock, $appendedStreamMock);41 static::assertEquals(1, $appendStream->detach());42 }43 public function testClose(): void44 {45 $streamMock = M::mock(Stream::class);46 $appendedStreamMock = M::mock(Stream::class);47 $streamMock->expects('close')->andReturns();48 $appendedStreamMock->expects('close')->andReturns();49 $appendStream = new AppendStream($streamMock, $appendedStreamMock);50 $appendStream->close();51 }52 public function testGetSize(): void53 {54 $streamMock = M::mock(Stream::class);55 $appendedStreamMock = M::mock(Stream::class);56 $streamMock->expects('getSize')->andReturns(1);57 $appendedStreamMock->expects('getSize')->andReturns(2);58 $appendStream = new AppendStream($streamMock, $appendedStreamMock);59 static::assertEquals(3, $appendStream->getSize());60 }61 public function testGetSizeNull(): void62 {63 $streamMock = M::mock(Stream::class);64 $appendedStreamMock = M::mock(Stream::class);65 $streamMock->expects('getSize')->andReturns(null);66 $appendedStreamMock->expects('getSize')->andReturns(2);67 $appendStream = new AppendStream($streamMock, $appendedStreamMock);68 static::assertNull($appendStream->getSize());69 }70 public function testReadTell(): void71 {72 $streamMock = M::mock(Stream::class);73 $appendedStreamMock = M::mock(Stream::class);74 $streamMock->expects('getSize')->andReturns(3);75 $appendedStreamMock->expects('getSize')->andReturns(3);76 $streamMock->expects('eof')->andReturns(false);77 $streamMock->expects('tell')->andReturns(0);78 $streamMock->expects('read')->with(3)->andReturns('abc');79 $appendedStreamMock->expects('read')->with(2)->andReturns('de');80 $streamMock->expects('eof')->andReturns(true);81 $streamMock->expects('getSize')->andReturns(3);82 $appendedStreamMock->expects('tell')->andReturns(2);83 $appendStream = new AppendStream($streamMock, $appendedStreamMock);84 static::assertEquals('abcde', $appendStream->read(5));85 static::assertEquals(5, $appendStream->tell());86 }87 public function testReadNullSize(): void88 {89 $this->expectException(RuntimeException::class);90 $this->expectExceptionMessage('AppendStream is only readable if the underlying streams sizes are known');91 $streamMock = M::mock(Stream::class);92 $appendedStreamMock = M::mock(Stream::class);93 $streamMock->expects('getSize')->andReturns(3);94 $appendedStreamMock->expects('getSize')->andReturns(null);95 $appendStream = new AppendStream($streamMock, $appendedStreamMock);96 $appendStream->read(12);97 }98 public function testReadAboveStream(): void99 {100 $streamMock = M::mock(Stream::class);101 $appendedStreamMock = M::mock(Stream::class);102 $streamMock->allows('getSize')->twice()->withNoArgs()->andReturns(3);103 $appendedStreamMock->expects('getSize')->withNoArgs()->andReturns(3);104 $streamMock->expects('eof')->andReturns(true);105 $appendedStreamMock->expects('tell')->andReturns(1);106 $appendedStreamMock->expects('read')->with(2)->andReturns('de');107 $appendStream = new AppendStream($streamMock, $appendedStreamMock);108 $appendStream->read(2);109 }110 public function testReadWithinStream(): void111 {112 $streamMock = M::mock(Stream::class);113 $appendedStreamMock = M::mock(Stream::class);114 $streamMock->expects('getSize')->withNoArgs()->andReturns(3);115 $appendedStreamMock->expects('getSize')->withNoArgs()->andReturns(3);116 $streamMock->expects('eof')->andReturns(false);117 $streamMock->expects('tell')->andReturns(1);118 $streamMock->expects('read')->with(2)->andReturns('de');119 $appendStream = new AppendStream($streamMock, $appendedStreamMock);120 $appendStream->read(2);121 }122 public function testEof(): void123 {124 $streamMock = M::mock(Stream::class);125 $streamMock->expects('eof')->andReturns(false);126 $appendStream = new AppendStream($streamMock, M::mock(Stream::class));127 static::assertFalse($appendStream->eof());128 }129 public function testEofAppended(): void130 {131 $streamMock = M::mock(Stream::class);132 $appendedStreamMock = M::mock(Stream::class);133 $streamMock->expects('eof')->andReturns(true);134 $appendedStreamMock->expects('eof')->andReturns(false);135 $appendStream = new AppendStream($streamMock, $appendedStreamMock);136 static::assertFalse($appendStream->eof());137 }138 public function testIsSeekableWriteableReadable(): void139 {140 $streamMock = M::mock(Stream::class);141 $appendedStreamMock = M::mock(Stream::class);142 $streamMock->expects('getSize')->andReturns(1);143 $streamMock->expects('isSeekable')->andReturns(true);144 $streamMock->expects('isWriteable')->andReturns(true);145 $streamMock->expects('isReadable')->andReturns(true);146 $appendedStreamMock->expects('getSize')->andReturns(1);147 $appendedStreamMock->expects('isSeekable')->andReturns(true);148 $appendedStreamMock->expects('isWriteable')->andReturns(true);149 $appendedStreamMock->expects('isReadable')->andReturns(true);150 $appendStream = new AppendStream($streamMock, $appendedStreamMock);151 static::assertTrue($appendStream->isSeekable());152 static::assertTrue($appendStream->isWriteable());153 static::assertTrue($appendStream->isReadable());154 }155 public function testSeek(): void156 {157 $streamMock = M::mock(Stream::class);158 $appendedStreamMock = M::mock(Stream::class);159 $streamMock->allows('getSize')->times(5)->andReturns(10);160 $appendedStreamMock->allows('getSize')->times(4)->andReturns(10);161 $streamMock->expects('seek')->with(10, SEEK_SET)->andReturns();162 $appendedStreamMock->expects('seek')->with(2, SEEK_SET)->andReturns();163 $appendStream = new AppendStream($streamMock, $appendedStreamMock);164 $appendStream->seek(10);165 $appendStream->seek(12);166 $streamMock->expects('eof')->withNoArgs()->andReturns(true);167 $appendedStreamMock->expects('tell')->withNoArgs()->andReturns(2);168 $appendedStreamMock->expects('seek')->with(5, SEEK_SET)->andReturns();169 $appendStream->seek(3, SEEK_CUR);170 $streamMock->expects('seek')->with(9, SEEK_SET)->andReturns();171 $appendStream->seek(11, SEEK_END);172 }173 public function testSeekInvalidSize(): void174 {175 $this->expectException(RuntimeException::class);176 $this->expectExceptionMessage('AppendStream is only seekable if the underlying streams sizes are known');177 $streamMock = M::mock(Stream::class);178 $appendedStreamMock = M::mock(Stream::class);179 $streamMock->expects('getSize')->withNoArgs()->andReturns(10);180 $appendedStreamMock->expects('getSize')->withNoArgs()->andReturns(null);181 $appendStream = new AppendStream($streamMock, $appendedStreamMock);182 $appendStream->seek(10);183 }184 public function testSeekInvalidWhence(): void185 {186 $this->expectException(InvalidArgumentException::class);187 $this->expectExceptionMessage('Invalid whence');188 $streamMock = M::mock(Stream::class);189 $appendedStreamMock = M::mock(Stream::class);190 $streamMock->expects('getSize')->withNoArgs()->andReturns(10);191 $appendedStreamMock->expects('getSize')->withNoArgs()->andReturns(10);192 $appendStream = new AppendStream($streamMock, $appendedStreamMock);193 $appendStream->seek(10, SEEK_SET - 1);194 }195 public function testSeekNegativeOffset(): void196 {197 $this->expectException(InvalidArgumentException::class);198 $this->expectExceptionMessage('Cannot seek to negative offset');199 $streamMock = M::mock(Stream::class);200 $appendedStreamMock = M::mock(Stream::class);201 $streamMock->expects('getSize')->withNoArgs()->andReturns(2);202 $appendedStreamMock->expects('getSize')->withNoArgs()->andReturns(1);203 $appendStream = new AppendStream($streamMock, $appendedStreamMock);204 $appendStream->seek(4, SEEK_END);205 }206 public function testRewind(): void207 {208 $streamMock = M::mock(Stream::class);209 $appendedStreamMock = M::mock(Stream::class);210 $streamMock->expects('rewind')->andReturns();211 $appendedStreamMock->expects('rewind')->andReturns();212 $appendStream = new AppendStream($streamMock, $appendedStreamMock);213 $appendStream->rewind();214 }215 public function testWrite(): void216 {217 $streamMock = M::mock(Stream::class);218 $appendedStreamMock = M::mock(Stream::class);219 $streamMock->expects('write')->with('ab')->andReturns(1);220 $appendedStreamMock->expects('write')->with('b')->andReturns(1);221 $appendStream = new AppendStream($streamMock, $appendedStreamMock);222 static::assertEquals(2, $appendStream->write('ab'));223 }224 public function testGetMetadata(): void225 {226 $streamMock = M::mock(Stream::class);227 $appendedStreamMock = M::mock(Stream::class);228 $streamMock->expects('getMetadata')->andReturns(['foo' => 'bar']);229 $appendedStreamMock->expects('getMetadata')->andReturns(['foo' => 'bar']);230 $appendStream = new AppendStream($streamMock, $appendedStreamMock);231 static::assertEquals([['foo' => 'bar'], ['foo' => 'bar']], $appendStream->getMetadata());232 }233}...
DbTablePopulatorTest.php
Source: DbTablePopulatorTest.php
...50 ]);51 $pdo = Mockery::mock(PDO::class);52 $this->pdoFactory->allows()53 ->getPdo($connection)54 ->andReturns($pdo);55 $statement = Mockery::mock(\PDOStatement::class);56 $pdo->allows()57 ->prepare(58 'SELECT table_name59 FROM INFORMATION_SCHEMA.TABLES 60 WHERE table_schema = :schema61 AND table_type = "BASE TABLE"'62 )63 ->andReturns($statement);64 $statement->allows()65 ->execute(['schema' => 'schema1'])66 ->andReturns($statement);67 $statement->allows()68 ->fetchAll(PDO::FETCH_COLUMN)69 ->andReturns(['table1', 'table2']);70 $output = $this->tablePopulator->populateTables($parsedSchema);71 $this->assertSame($parsedSchema, $output);72 $this->assertEquals(['table1', 'table2'], $output->getTables());73 }74 public function testNoTablesArePopulatedIfTheyAreAlreadyProvided()75 {76 $config = Mockery::mock(SchemaConfigInterface::class);77 $parsedSchema = new ParsedSchema($config, '/a/path', ['table1', 'table2']);78 $config->allows(['getExcludes' => []]);79 $output = $this->tablePopulator->populateTables($parsedSchema);80 $this->assertSame($parsedSchema, $output);81 $this->assertEquals(['table1', 'table2'], $output->getTables());82 }83 public function testTablesAreNotExcludedIfIncludedInExcludeList()84 {85 $config = Mockery::mock(SchemaConfigInterface::class);86 $parsedSchema = new ParsedSchema($config, '/a/path', ['table1', 'table2']);87 $config->allows(['getExcludes' => ['table1']]);88 $output = $this->tablePopulator->populateTables($parsedSchema);89 $this->assertSame($parsedSchema, $output);90 $this->assertEquals(['table1', 'table2'], $output->getTables());91 }92 public function testTablesAreFilteredWhenPopulatedFromADatabase()93 {94 $config = Mockery::mock(SchemaConfigInterface::class);95 $parsedSchema = new ParsedSchema($config, '/a/path', []);96 $connection = Mockery::mock(ConnectionConfigInterface::class);97 $config->allows([98 'getExcludes' => ['table1'],99 'getSchema' => 'schema1',100 'getConnection' => $connection,101 ]);102 $pdo = Mockery::mock(PDO::class);103 $this->pdoFactory->allows()104 ->getPdo($connection)105 ->andReturns($pdo);106 $statement = Mockery::mock(\PDOStatement::class);107 $pdo->allows()108 ->prepare(109 'SELECT table_name110 FROM INFORMATION_SCHEMA.TABLES 111 WHERE table_schema = :schema112 AND table_type = "BASE TABLE"'113 )114 ->andReturns($statement);115 $statement->allows()116 ->execute(['schema' => 'schema1'])117 ->andReturns($statement);118 $statement->allows()119 ->fetchAll(PDO::FETCH_COLUMN)120 ->andReturns(['table1', 'table2']);121 $this->tableFilterer->allows()122 ->filter(['table1', 'table2'], ['table1'])123 ->andReturns(['table2']);124 $output = $this->tablePopulator->populateTables($parsedSchema);125 $this->assertSame($parsedSchema, $output);126 $this->assertEquals(['table2'], $output->getTables());127 }128}...
andReturns
Using AI Code Generation
1$are = new are();2$are->andReturns(1, 2, 3);3$are = new are();4$are->andReturns(1, 2, 3);5$are = new are();6$are->andReturns(1, 2, 3);7$are = new are();8$are->andReturns(1, 2, 3);9$are = new are();10$are->andReturns(1, 2, 3);11$are = new are();12$are->andReturns(1, 2, 3);13$are = new are();14$are->andReturns(1, 2, 3);15$are = new are();16$are->andReturns(1, 2, 3);17$are = new are();18$are->andReturns(1, 2, 3);19$are = new are();20$are->andReturns(1, 2, 3);21$are = new are();22$are->andReturns(1, 2, 3);23$are = new are();24$are->andReturns(1, 2, 3);25$are = new are();26$are->andReturns(1, 2, 3);
andReturns
Using AI Code Generation
1$are = new are();2$are->andReturns(2, 4, 6);3$are = new are();4$are->andReturns(3, 5, 7);5$are = new are();6$are->andReturns(4, 6, 8);7$are = new are();8$are->andReturns(5, 7, 9);9$are = new are();10$are->andReturns(6, 8, 10);11$are = new are();12$are->andReturns(7, 9, 11);13$are = new are();14$are->andReturns(8, 10, 12);15$are = new are();16$are->andReturns(9, 11, 13);17$are = new are();18$are->andReturns(10, 12, 14);19$are = new are();20$are->andReturns(11, 13, 15);21$are = new are();22$are->andReturns(12, 14, 16);23$are = new are();24$are->andReturns(13, 15, 17);25$are = new are();26$are->andReturns(14, 16, 18);
andReturns
Using AI Code Generation
1$are = new are;2$are->andReturns('Hello', 'World');3$are = new are;4$are->andReturns('Hello World');5$are = new are;6$are->andReturns('Hello World', 1);7$are = new are;8$are->andReturns(1, 2);9$are = new are;10$are->andReturns(1, 'Hello');11$are = new are;12$are->andReturns(1, 'Hello', 2);13$are = new are;14$are->andReturns(1, 1);15$are = new are;16$are->andReturns(1, 2, 3);17$are = new are;18$are->andReturns(1, 2, 3, 4);19$are = new are;20$are->andReturns(1, 2, 3, 4, 5);21$are = new are;22$are->andReturns(1, 2, 3, 4, 5, 6);23$are = new are;24$are->andReturns(1, 2, 3, 4, 5, 6, 7);25$are = new are;26$are->andReturns(1, 2, 3, 4, 5, 6, 7
andReturns
Using AI Code Generation
1$are = new are();2$are->andReturns(1, 2, 3);3$are->andReturns(1, 2, 3, 4, 5, 6);4$are->andReturns(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);5$are->andReturns(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);6$are = new are();7$are->andReturns(1, 2, 3);8$are->andReturns(1, 2, 3, 4, 5, 6);9$are->andReturns(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);10$are->andReturns(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);11$are = new are();12$are->andReturns(1, 2, 3);13$are->andReturns(1, 2, 3, 4, 5, 6);14$are->andReturns(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);15$are->andReturns(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);16$are = new are();17$are->andReturns(1, 2, 3);18$are->andReturns(1, 2, 3, 4, 5, 6);19$are->andReturns(1, 2, 3, 4,
andReturns
Using AI Code Generation
1$are = new are();2$are->andReturns(2, 3);3$are->andReturns(1, 0);4$are->andReturns(0, 0);5$are->andReturns(0, 1);6$are = new are();7$are->andReturns(2, 3);8$are->andReturns(1, 0);9$are->andReturns(0, 0);10$are->andReturns(0, 1);11$are = new are();12$are->andReturns(2, 3);13$are->andReturns(1, 0);14$are->andReturns(0, 0);15$are->andReturns(0, 1);16$are = new are();17$are->andReturns(2, 3);18$are->andReturns(1, 0);19$are->andReturns(0, 0);20$are->andReturns(0, 1);21$are = new are();22$are->andReturns(2, 3);23$are->andReturns(1, 0);24$are->andReturns(0, 0);25$are->andReturns(0, 1);26$are = new are();27$are->andReturns(2, 3);28$are->andReturns(1, 0);29$are->andReturns(0, 0);30$are->andReturns(0, 1);31$are = new are();32$are->andReturns(2, 3);33$are->andReturns(1, 0);34$are->andReturns(0, 0);35$are->andReturns(0, 1);36$are = new are();37$are->andReturns(2, 3);
andReturns
Using AI Code Generation
1require_once 'are.class.php';2$are = new are;3$are->andReturns($_GET['id'], $_GET['name'], $_GET['age']);4require_once 'are.class.php';5$are = new are;6$are->andReturns($_GET['id'], $_GET['name'], $_GET['age']);7require_once 'are.class.php';8$are = new are;9$are->andReturns($_GET['id'], $_GET['name'], $_GET['age']);10require_once 'are.class.php';11$are = new are;12$are->andReturns($_GET['id'], $_GET['name'], $_GET['age']);13require_once 'are.class.php';14$are = new are;15$are->andReturns($_GET['id'], $_GET['name'], $_GET['age']);16require_once 'are.class.php';17$are = new are;18$are->andReturns($_GET['id'], $_GET['name'], $_GET['age']);19require_once 'are.class.php';20$are = new are;21$are->andReturns($_GET['id'], $_GET['name'], $_GET['age']);22require_once 'are.class.php';23$are = new are;24$are->andReturns($_GET['id'], $_GET['name'], $_GET['age']);25require_once 'are.class.php';26$are = new are;27$are->andReturns($_GET['id'], $_GET['name'], $_GET['age']);28require_once 'are.class.php';29$are = new are;30$are->andReturns($_GET['id'], $_GET['name'], $_GET['age']);
andReturns
Using AI Code Generation
1require_once('are.php');2$are = new are();3$are->andReturns('test1', 'test2', 'test3');4echo $are->getAndReturns();5require_once('are.php');6$are = new are();7$are->andReturns('test1', 'test2', 'test3');8echo $are->getAndReturns();9require_once('are.php');10$are = new are();11$are->andReturns('test1', 'test2', 'test3');12echo $are->getAndReturns();13require_once('are.php');14$are = new are();15$are->andReturns('test1', 'test2', 'test3');16echo $are->getAndReturns();17require_once('are.php');18$are = new are();19$are->andReturns('test1', 'test2', 'test3');20echo $are->getAndReturns();21require_once('are.php');22$are = new are();23$are->andReturns('test1', 'test2', 'test3');24echo $are->getAndReturns();25require_once('are.php');26$are = new are();27$are->andReturns('test1', 'test2', 'test3');28echo $are->getAndReturns();29require_once('are.php');30$are = new are();31$are->andReturns('test1', 'test2', 'test3');32echo $are->getAndReturns();33require_once('are.php');34$are = new are();35$are->andReturns('test1', 'test2', 'test3');36echo $are->getAndReturns();
andReturns
Using AI Code Generation
1require_once 'are.class.php';2$are = new are;3$are->andReturns('Hello', 'World');4require_once 'are.class.php';5$are = new are;6$are->andReturns('Hello', 'World');7require_once 'are.class.php';8$are = new are;9$are->andReturns('Hello', 'World');10require_once 'are.class.php';11$are = new are;12$are->andReturns('Hello', 'World');13require_once 'are.class.php';14$are = new are;15$are->andReturns('Hello', 'World');16require_once 'are.class.php';17$are = new are;18$are->andReturns('Hello', 'World');19require_once 'are.class.php';20$are = new are;21$are->andReturns('Hello', 'World');22require_once 'are.class.php';23$are = new are;24$are->andReturns('Hello', 'World');25require_once 'are.class.php';26$are = new are;27$are->andReturns('Hello', 'World');28require_once 'are.class.php';29$are = new are;30$are->andReturns('Hello', 'World');31require_once 'are.class.php';32$are = new are;33$are->andReturns('Hello', 'World');
andReturns
Using AI Code Generation
1require_once('are.class.php');2$are = new are();3$are->andReturns(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);4$are->andReturns(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);5$are->andReturns(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);6require_once('are.class.php');7$are = new are();8$are->andReturns(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);9$are->andReturns(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);10$are->andReturns(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);11require_once('are.class.php');12$are = new are();13$are->andReturns(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);14$are->andReturns(1,2,3,4,5,6
Check out the latest blogs from LambdaTest on this topic:
Dries Buytaert, a graduate student at the University of Antwerp, came up with the idea of developing something similar to a chat room. Moreover, he modified the conventional chat rooms into a website where his friends could post their queries and reply through comments. However, for this project, he thought of creating a temporary archive of posts.
In today’s world, an organization’s most valuable resource is its customers. However, acquiring new customers in an increasingly competitive marketplace can be challenging while maintaining a strong bond with existing clients. Implementing a customer relationship management (CRM) system will allow your organization to keep track of important customer information. This will enable you to market your services and products to these customers better.
Developed in 2004 by Thoughtworks for internal usage, Selenium is a widely used tool for automated testing of web applications. Initially, Selenium IDE(Integrated Development Environment) was being used by multiple organizations and testers worldwide, benefits of automation testing with Selenium saved a lot of time and effort. The major downside of automation testing with Selenium IDE was that it would only work with Firefox. To resolve the issue, Selenium RC(Remote Control) was used which enabled Selenium to support automated cross browser testing.
There are times when developers get stuck with a problem that has to do with version changes. Trying to run the code or test without upgrading the package can result in unexpected errors.
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.
Execute automation tests with andReturns on a cloud-based Grid of 3000+ real browsers and operating systems for both web and mobile applications.
Test now for FreeGet 100 minutes of automation test minutes FREE!!