// $G $D/$F.go && $L $F.$A && ./$A.out

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.


package main

func
main()
{
	var c string;

	a := `abc`;
	b := `xyz`;

	/* print a literal */
	print(`abc`);

	/* print a variable */
	print(b, "-");

	/* catenate literals */
	print(`abc` + `xyz`, "-");

	/* catenate variables */
	print(a+b, "-");

	/* compare literals */
	if `abc` == `xyz` || `abc` != "abc" || `abc` > `xyz` {
		panic("compare literals");
	}

	/* compare variables */
	if a == b || a != a || a > b {
		panic("compare variables");
	}

	/* cat */
	c = a+b;
	print(c, "-");

	/* catequal */
	c = a;
	c += b;
	print(c, "-");

	/* clumsy evaluation */
	c = b;
	c = a + c;
	print(c, "-");

	/* len */
	if len(c) != 6 {
		panic("len ", len(c));
	}

	/* index strings */
	for i:=0; i<len(c); i=i+1 {
		if c[i] != (a+b)[i] {
			panic("index ", i, " ", c[i], " ", (a+b)[i]);
		}
	}

	/* slice strings */
	print(c[0:3], c[3:]);

	print("\n");

	/* create string with integer constant */
	c = string('x');
	if c != "x" {
		panic("create int ", c);
	}

	/* create string with integer variable */
	v := 'x';
	c = string(v);
	if c != "x" {
		panic("create int ", c);
	}

	/* create string with byte array */
	var z1 [3]byte;
	z1[0] = 'a';
	z1[1] = 'b';
	z1[2] = 'c';
	c = string(&z1);
	if c != "abc" {
		panic("create byte array ", c);
	}

	/* create string with int array */
	var z2 [3]int;
	z2[0] = 'a';
	z2[1] = '\u1234';
	z2[2] = 'c';
	c = string(&z2);
	if c != "a\u1234c" {
		panic("create int array ", c);
	}

	/* create string with byte array pointer */
	z3 := new([3]byte);
	z3[0] = 'a';
	z3[1] = 'b';
	z3[2] = 'c';
	c = string(z3);
	if c != "abc" {
		panic("create array pointer ", c);
	}
}
