codegen: fix codegen_switch and add some tests