Ot wes thi bist uf tomis I just love this simple cypher, it's so fun reading not-quite human-readable words and filling the gaps...

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.


The rules are super-simple:


Accept some text as input (ascii characters, upper/lower case letters and punctuation).
For each vowel, rotate it to the next vowel, or back to the start.


a => e
e => i
i => o
o => u
u => a

Upper case vowels stay upper case, lower case vowels stay lower case.
Output the text after these conversions.
No need to support accents.
The all other characters should remain unchanged.
Try to do it in the smallest number of bytes.
Any old language you like.




Test Cases

It was the best of times, it was the worst of times,
it was the age of wisdom, it was the age of foolishness,
it was the epoch of belief, it was the epoch of incredulity,
it was the season of light, it was the season of darkness,
it was the spring of hope, it was the winter of despair,
we had everything before us, we had nothing before us,
we were all going direct to heaven, we were all going direct the other way –
in short, the period was so far like the present period,
that some of its noisiest authorities insisted on its being received,
for good or for evil, in the superlative degree of comparison only.


Out: 

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.


In:

The quick brown fox jumps over the lazy dog.


Out:

Thi qaock bruwn fux jamps uvir thi lezy dug.


In:

Home is where the heart is.


Out:

Humi os whiri thi hiert os.


In:

Boaty McBoatface


Out:

Buety McBuetfeci


In:

AEIOUaeiou


Out:

EIOUAeioua


In:

Programming Puzzles And Code Golf


Out:

Prugremmong Pazzlis End Cudi Gulf
MS-SQL, 51 Bytes
Works on SQL 2017 or above:
SELECT TRANSLATE(v,'AEIOUaeiou','EIOUAeioua')FROM t

The new function TRANSLATE performs individual character replacement, so is ideally suited for this challenge.
Input is via a pre-existing table t with varchar column v, per our IO rules.
In this case the table must be created using a case-sensitive collation, either by running on a case-sensitive server, or by using the COLLATE keyword (not counted toward character total):
CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)

EDIT: SSMS may cut off the lengthy quote above when returning the result in a &quot;results to text&quot; window, this is a client setting, not a bug in my program.
To fix, go to Tools &gt; Options &gt; Query Results &gt; SQL Server &gt; Results to Text and increase the &quot;Maximum number of characters displayed in each column.&quot;